我正在编写一个从/dev/ttyUSB0
读取数据的应用程序。
我发现有必要在while循环中调用sleep
之前调用read
,这样我就可以立即获得整行。否则,有时我会在下一次迭代中获得部分线和其余部分。
我是否必须使用包含发送字符串长度的标头打包我的数据?或者,还有更好的方法?
while(1) {
usleep(10000);
unsigned char buf[80];
int rdlen;
ioctl(fd, FIONREAD, &rdlen);
if (rdlen > 0) {
rdlen = read(fd, buf, rdlen);
}
if (rdlen > 0) {
...
}
答案 0 :(得分:0)
更好的方法是简单地处理接收部分行,如果重要的话,让你的代码在完成一行时读出数据。
之类的东西(根本未经过测试):
char buffer[1000];
size_t offset = 0;
while(1 ){
int len = read(fd, buffer+offset,(unsigned)(sizeof(buffer)-offset));
if(!strchr(buffer+offset, '\n')){
/* no end-of-line */
offset +=len;
}
else
{
/* deal with complete line */
offset = 0;
}
}