最近花了四天的时间在帮实验室调试一块嵌入式Linux板的串口,之前一直在stm32平台上做开发,这次是第一次接触Linux系统下的串口,所以收获还是蛮多的。
Q&A
- 串口发送数据时停止超过5秒就发送不了,也就是数据发送的间隔不能超过5秒?
解决方法是每次需要传输数据时打开串口,传输完成后关闭串口。但是至今还没有找到问题的根源所在,刚开始怀疑是串口配置的问题,但是同样的串口配置在笔记本上运行就没有这个问题,所以现在怀疑是串口驱动或者是硬件的问题。我花费了很多时间在这个问题上,因为还不是很了解驱动方面的知识,所以这个问题留到以后解决吧 - 串口接收数据时一段时间后就接收不到了,但是数据是由姿态传感器一直在发送的?
这个问题是因为串口配置不正确引起的。因为我注意到使用putty能够正常接收数据而不会一段时间后死掉,所以我使用了stty命令查看putty串口配置。发现我写的程序中串口配置将ixon关闭了,打开ixon选项后数据就能够正常接收了。打开ixon选项表示使用软件流控,因为姿态传感器也开启了软件流控,其会一直发送数据给板子的串口,直到板子的串口通过软件流控发送某个特定的字符告诉姿态传感器暂停发送,因为之前没有使用软件流控,姿态传感器就一直发数据,导致板子的串口被大量的数据淹没而死掉。
收获与体会
- C语言在Linux中操作串口是通过读写文件/dev/ttyS*来实现的,非常符合一切皆文件的思想,读写串口前要确保你拥有相应的权限,每次重启计算机后权限会恢复
- 串口的配置在每次重启计算机后也会被恢复,但是程序修改串口的配置在程序结束后仍然会保留,这一点被我利用来查看putty的串口配置
- 在命令行中可以通过stty命令配置串口
- 在测试串口收发的数据时候一致的时候,可以直接把串口的TX引脚和RX引脚接一起,这样就不需要用到另一台计算机了
- 在命令行中可以非常方便地发送和接收数据,通过
echo mesg > /dev/ttyS*
发送数据,通过cat /dev/ttyS*
接收数据 - Linux下串口的配置参数真的是非常多,但是在Linux下的实时性很难保证,在单片机中串口发送数据就是真的发送了,但是在Linux中还会把数据缓存起来,很难确定什么时候真的发送了