linux下串口读数据,read函数的一个问题

tastier 2014-08-08 11:01:36
在非标准模式下,read函数如何判断什么时候返回?
char buff[50];
while (1)
{
nread = read(fd, buff, 50);
if (nread<=0)
{
perror("read data error");
break;
}
printf( "%s", buff); //
printf("\n");
}
串口发送端一秒钟发送一个“hello world!”,但是上面的接收程序有时候不能完整的读取hello world!,例如有时候会这样:
hello world!
hello wor
ld!
he
llo world!

这是读取三个hello world的情况,望大神们告诉我问题在哪,拜谢!
...全文
1401 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
图灵转世 2014-11-21
  • 打赏
  • 举报
回复
我也发现linux下有这个问题,不知道有啥好的方法解决。
zacharyLiu 2014-11-19
  • 打赏
  • 举报
回复
select
故都 2014-11-19
  • 打赏
  • 举报
回复
把printf("\n"); 去了试试呢? 还有 完成一个循环后 加上一句fflush(stdout);试试
Z_Star 2014-11-19
  • 打赏
  • 举报
回复
个人觉得select也没用,因为uart写不一定刚好全部写完,你的read刚好去读。
falloutmx 2014-08-08
  • 打赏
  • 举报
回复
正常,字数到达一定程度或者超时时间到了以后就会完成操作
colddown 2014-08-08
  • 打赏
  • 举报
回复
把printf("\n");删掉就行了。对read来说就是从一个数据流中读取信息,并不保证每次读一整行。 如果非要一次读一行,可以先用fdopen获取FILE*指针,再用fgets读。
tastier 2014-08-08
  • 打赏
  • 举报
回复
引用 4 楼 falloutmx 的回复:
设置下VTIME和VMIN试试吧
我想实现的功能是读不到字符就一直阻塞,但是字符的长度是不一定的。这就和这两个参数没关系了吧
tastier 2014-08-08
  • 打赏
  • 举报
回复
引用 3 楼 colddown 的回复:
发送的时候有回车符吗?普通没有程序怎么断句?
我现在在字符串后面加了\n,单步调试发现,read有的时候可以一次性把整个字符串读完,有的时候又不行
falloutmx 2014-08-08
  • 打赏
  • 举报
回复
设置下VTIME和VMIN试试吧
colddown 2014-08-08
  • 打赏
  • 举报
回复
发送的时候有回车符吗?普通没有程序怎么断句?
tastier 2014-08-08
  • 打赏
  • 举报
回复
引用 1 楼 falloutmx 的回复:
正常,字数到达一定程度或者超时时间到了以后就会完成操作
怎么控制一次读完一个完整的字符串?

1,319

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧