我在Debian 6(ARM)上使用(看似)挑剔的USB网络设备(zigbee)。通信都是通过“AT”命令集进行的。我正在讨论IO缓冲区的一些问题,我希望有人能说明如何最好地管理它。
问题:要协商USB设备和我正在使用的传感器之间的连接,我必须遵循一系列命令。通常有3-5:有些我只需要知道成功/失败,而其他需要我获得返回值并在以后使用它。除了设备的输出通常是相同消息的重复序列的页面(通常是旧命令的返回值)之外,这一切都很好。有时它是以前的命令,有时它是字母“A”(真的)的序列。
这就是为什么我认为我对IO流管理不当。
我是如何尝试使用它的:
fd = open( pPort, O_RDWR | O_APPEND );
if ( fd == -1 )
{
fprintf( stderr, "Unable to connect to port: %s", pPort );
perror( "err: " );
exit( 0 );
}
else fprintf( stderr, "Connected to %s\n", pPort );
// setup the buffering
struct termios options;
tcgetattr( fd, &options );
cfsetispeed( &options, B19200 );
cfsetospeed( &options, B19200 );
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~( IXON | IXOFF | IXANY );
tcsetattr( fd, TCSANOW, &options );
// clear out any outstanding IO
sleep( 2 );
tcflush( fd, TCIOFLUSH );
int fw = write( fd, cmd, strlen( cmd ) );
if( fw == 0 )
{
perror( "fwrite err: ");
exit( 0 );
}
sleep( 2 );
while( 1 )
{
n = read( fd, &in, 1 );
instr += in;
std::size_t found = instr.find( "OK\n" );
if( found != std::string::npos )
break;
static const boost::regex regx( "ERROR: /d{2}" );
boost::cmatch match;
if( boost::regex_search( instr.c_str(), match, regx ))
std::cout << "(5)" << instr << "\n";
}
最初我曾希望使用'从缓冲区读取,直到它为空,然后写'策略,但缓冲区永远不会为空。或者至少它在读取时总是返回字符。
答案 0 :(得分:0)
串行驱动程序可能正在对命令进行一些处理 - 尝试使用cfmakeraw
来设置除了你拥有的一些termios设置。另外,请确保options.c_cc[VMIN] = 1
,这将确保您在到达端口后立即获得一个字节。