从串口读取时使用sleep()

时间:2017-12-11 22:20:58

标签: c linux serial-port

我正在编写一个从/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) {
            ...     

    } 

1 个答案:

答案 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;
}
}