linux下诡异的串口read问题,数据不全

winmenaruto 2011-04-14 03:17:14
类似的问题以前有过 :http://topic.csdn.net/u/20070801/19/bd9a2829-3c24-42af-8ac6-0e6a78218fba.html

如果串口buffer为8字节,我的电脑上试下来就是8字节,我构造了数据,在发送机里发送:
123456789012

有时候能一次受到123456789012,有时候只能受到12345678,第二次受到余下的数,我很好奇,如果buffer就是8位,为什么有时候能收全,有时候不能???

while( 1 )
{
nread = read( ser_fd, buffer, sizeof(buffer));
while(nread >0)//表示收到数据了
{ 。。。。。。。。。。。。 处理中 }
}
...全文
931 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
winmenaruto 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 feiyinzilgd 的回复:]
都跟你说了用select...
[/Quote]
select读主要实现的功能是,在一定时间内不停地看串口有没有数据,有数据则进行读,当时间过去后还没有数据,则返回超时错误。

那如果很长的时间都没有数据过来,比如2分钟,那不就返回了,还有,select的效率和while比起来如何呢?
谭海燕 2011-04-16
  • 打赏
  • 举报
回复
都跟你说了用select...
谭海燕 2011-04-15
  • 打赏
  • 举报
回复
阻塞也是分情况的

有一种阻塞是占CPU的。

有一种阻塞是休眠不占CPU.条件满足之后自动被唤醒。
winmenaruto 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feiyinzilgd 的回复:]
所谓的非阻塞,其实是通过回调函数实现的。

Linux下对于数据读取所谓的非阻塞差不多就是 select,还有就是轮询方式。

如果你觉得还不够非阻塞的话,你还可以自己实现,当有数据的时候给你发送一个信号,然后注册个信号

处理函数就OK了。
[/Quote]
那我如果串口设置:阻塞方式,read之后阻塞,然后谁来唤醒 ?也是select ?“Linux下对于数据读取所谓的非阻塞差不多就是 select” ,阻塞、非阻塞都是用这个来唤醒?
谭海燕 2011-04-15
  • 打赏
  • 举报
回复
所谓的非阻塞,其实是通过回调函数实现的。

Linux下对于数据读取所谓的非阻塞差不多就是 select,还有就是轮询方式。

如果你觉得还不够非阻塞的话,你还可以自己实现,当有数据的时候给你发送一个信号,然后注册个信号

处理函数就OK了。
winmenaruto 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feiyinzilgd 的回复:]
google下吧LZ.问问题之前。
[/Quote]
还有请问,我监听串口数据,用的是:
  while(   1   ) 
{
nread = read( ser_fd, buffer, sizeof(buffer));
while(nread >0)//表示收到数据了
{ 。。。。。。。。。。。。 处理中 }
}

while里不停的查询,我放在线程里边,以防止界面卡住,但是我有16个串口,我开了16个线程。。也就是有16个双层的while跑着。。。我担心cpu占用太高,但是想不出其他办法。。串口监听都是这么标准的程序:
while (1) //循环读取数据

{

while((nread = read(fd, buff, 512))>0)

{

printf("\nLen %d\n",nread);

buff[nread+1] = '\0';

printf( "\n%s", buff);

}

}

yong_f 2011-04-15
  • 打赏
  • 举报
回复
select是一个函数调用一下就可以了,
谭海燕 2011-04-15
  • 打赏
  • 举报
回复


google下吧LZ.问问题之前。
winmenaruto 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 feiyinzilgd 的回复:]
apue就够了。

Qt。。未果。。
[/Quote]
linux没有自己的书嘛?unix的好像有点差别吧
谭海燕 2011-04-15
  • 打赏
  • 举报
回复
apue就够了。

Qt。。未果。。
winmenaruto 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 feiyinzilgd 的回复:]
阻塞也是分情况的

有一种阻塞是占CPU的。

有一种阻塞是休眠不占CPU.条件满足之后自动被唤醒。
[/Quote]
还有请问,有什么经典的linux c编程的书 ?类似于谭浩强这样的地位的。。。
本来一直想买qt的书,但发觉,真的linux编程,主要还是用API。。qt只要会控件就好。。功能还是API实现的
winmenaruto 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feiyinzilgd 的回复:]
用 select检测
[/Quote]
奥。。那这样其实没有非阻塞的用起来方便啊
winmenaruto 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feiyinzilgd 的回复:]
用 select检测
[/Quote]
能稍微说具体点吗,我是linux 初学者,谢谢~~~~
谭海燕 2011-04-14
  • 打赏
  • 举报
回复
用 select检测
winmenaruto 2011-04-14
  • 打赏
  • 举报
回复
还有如果我串口是阻塞的,没收到数据,挂起了,那怎么唤醒他??一直睡下去了难道 ??
Re: 《Linux 系统常用内置命令》  ---------------------------------------内容提要:     01. Linux内置命令概述;两栖命令 echo pwd kill 等等    02. 判断内置命令的方式;help -d [command] 能够正常回显    03. 内置命令在 shell 脚本中的基础应用介绍    04. 内置命令 alias 和 unalias 自定义别名和删除别名;临时生效与永久生效    05. 后台前台 出将入相 腾腾转 任务相关命令 bg fg jobs    06. SHELL 循环的处理方式 break continue exit    07. 常见 builtin 内置命令 eval exit export history    08. 内置命令 read 交互式赋值变量;type 判断命令类型    09. 内置命令 ulimit 修改系统资源使用限制;unset 清空变量  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述!  《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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