串口通信,用的太多了,然而一直没有深入研究过。从刚开始入门单片机,就学习了如何用电脑和单片机通信,但是一旦通信成功后,就再也没有仔细去深入研究过了。这次在使用嵌入式Linux开发板的过程中,被一个问题卡了很久很久,使得我重新认识了串口通信。
问题初现
JZ2440开发板带有1个USB-COM口,三个普通的COM口。电脑通过一条USB线,插到板子的USB-COM口,与板子相连,用来发送控制命令。现在我想使用普通的COM口来和电脑通信,笔记本电脑不带COM口,所以常规的做法就是接一条USB转串口线来实现。接好之后,开发板串口测试程序也写好了,于是,我打开了电脑上的串口调试助手,开始调试。结果发现,从开发板发过来的数据,跟调试助手显示的不一致。我从开发板发送“ttttt”,电脑收到的十六进制是D1 D1 D1 D1 11。从ascii表上,查到't'应该是74,完全对不上。从此,我陷入到了维持几乎两周的困境。
噩梦开始
1.怀疑COM2口本身坏了,换成旁边的COM3,依旧如此,更换了USB转串口线,还是如此。
2.仔细检查程序是否存在bug,并没有。
3.检查串口参数设置是否一致。波特率、数据位、校验位、停止位、流控,全部都一致。
4.接下来,我开始从发送和接收的数据上来推算,某些规律。
下面是一些测试:
发送一个0x01
电脑串口助手发送 0000 0001
开发板收到的 是 0111 1111
感觉上是位的位置对调,然后全部取反了。电脑和开发板的取位顺序不一致?
发送两个0x01
电脑串口助手发送 0000 0001 0000 0001