• 4457阅读
  • 4回复

[提问]串口通信的read函数 [复制链接]

上一主题 下一主题
离线twodiamond
 

只看楼主 倒序阅读 楼主  发表于: 2016-04-12
— 本帖被 XChinux 从 Qt 作品展 移动到本区(2016-04-12) —

关于串口通信(非Qt5) - 如何知道串口已经接收完成一个完整的数据包(linux)?
现在的做法是:
com->write();
usleep(t);            //t 表示睡眠的时间
com->read();

因为不同的write()得到的read()数据包长度不一定(10字节 ~ 250 字节),这个睡眠时间 t 只能按最大来设置,如果有办法知道串口收包完成,就不必等最大时间了。

谢谢!
离线labhome

只看该作者 1楼 发表于: 2016-04-12
无论是定长还是不定长,都应该有通讯协议,收到数据保存起来,根据协议求规则来解析出完整的数据。
离线zhangcan

只看该作者 2楼 发表于: 2016-04-13
离线twodiamond

只看该作者 3楼 发表于: 2016-04-14
多谢2位!
@labhome  
串口链路层协议是有的,就像你说的,收到后缓存起来,然后再解包校验 - 但有没有可能接收一个完整的串口包后,再来解析呢?


@zhangcan  
多谢例子工程!

情形是这样:除了串口232线程,还有一个gui线程和其它线程,串口线程只有很小的占有率,采用modbus协议,先发送,然后sleep等待,醒来后读串口,可能此时一个完整的应答包还没收完,然后再睡眠,再醒来接收,直到接收一个完整的包,最后来解析。
但串口类中有一个函数setTimeout(),好像是设置串口接收字符间隔的时间,当接收完一个字符,等待这么长的时间,没有下一个字符时,则任务一个串口包接收完成,但不知如何用这个机制来定义睡眠的时间?


谢谢!

本帖提到的人: @labhome @zhangcan
离线z609932088

只看该作者 4楼 发表于: 2016-04-14
可以定义包大小,默认收到多少了,就是完整包了,判定完成后,在解析不就好了
有阳光的地方就是青春
快速回复
限100 字节
 
上一个 下一个