标题:串口通信的read函数
作者:twodiamond
日期:2016-04-12 10:29
内容:
关于串口通信(非Qt5) - 如何知道串口已经接收完成一个完整的数据包(linux)?
现在的做法是:
com->write();
usleep(t);//t 表示睡眠的时间
com->read();
因为不同的write()得到的read()数据包长度不一定(10字节 ~ 250 字节),这个睡眠时间 t 只能按最大来设置,如果有办法知道串口收包完成,就不必等最大时间了。
谢谢!
#1 [labhome 04-12 11:18]
无论是定长还是不定长,都应该有通讯协议,收到数据保存起来,根据协议求规则来解析出完整的数据。
#2 [zhangcan 04-13 08:29]
http://blog.csdn.net/caoshangpa/article/details/50915005
#3 [twodiamond 04-14 11:35]
多谢2位!
@labhome
串口链路层协议是有的,就像你说的,收到后缓存起来,然后再解包校验 - 但有没有可能接收一个完整的串口包后,再来解析呢?
@zhangcan
多谢例子工程!
情形是这样:除了串口232线程,还有一个gui线程和其它线程,串口线程只有很小的占有率,采用modbus协议,先发送,然后sleep等待,醒来后读串口,可能此时一个完整的应答包还没收完,然后再睡眠,再醒来接收,直到接收一个完整的包,最后来解析。
但串口类中有一个函数setTimeout(),好像是设置串口接收字符间隔的时间,当接收完一个字符,等待这么长的时间,没有下一个字符时,则任务一个串口包接收完成,但不知如何用这个机制来定义睡眠的时间?
谢谢!
#4 [z609932088 04-14 17:00]
可以定义包大小,默认收到多少了,就是完整包了,判定完成后,在解析不就好了