我想用树莓派与传感器连接,完成控制与通信。
一、起初,能发出正确的指令、但接收到的是远超9字节的返回,且发出的正确指令并非每一次都能成功发出
经过排查,我将怀疑重点定在了自己使用的是miniuart上,通过从/dev/ttyS0向/dev/ttyAMA0的调整,问题得到了一定程度的缓解。
然而这一调整也许是非必要的,原因在于:经过这一调整问题虽有缓解、但依然没有彻底解决。直到做了其它调整之后,问题才彻底解决。所以也许从一开始就做“其他调整”的话,也许在/dev/ttyS0上,也能得到正确、理想的解决。
二、换到/dev/ttyAMA0之后,能正确发出命令、能正确的收到回复。然而发出命令并非每一次都能成功,收到的回复也并非每一次都能收到,即便收到了回复,也不完整
尤其是收到的回复信息很奇怪,总会丢掉最初的3个字节。例如预期收到123456789,实际收到的或者收不到、或者就是只能收到456789。
几经排查,最终发现是agetty进程在竞争使用/dev/ttyAMA0资源。并且这个agetty进程不仅仅是竞争使用、而且似乎是在不断地改变波特率(它可能是在几个常用波特率之间进行变化以扫描可能来临的登录请求)。
/sbin/agetty -o -p — \u –keep-baud 115200,57600,38400,9600 – vt22
正是因为它在不断地改变波特率,所以我的程序即便内部设置了19200的波特率,程序在发出或接收数据的时候,依然会因为波特率在变化,导致首发信息一会儿正常、一会儿异常;而且在“偶尔正常时”,收到的数据也会被agetty进程“吃掉一些字节”。
三、通过设置解决问题
在raspi-config关于“串口”的设置中,我发现它有2个问询对话:是否支持串口登录、是否激活串口。我之前应该是没有注意到这两个问题,全部选择了“是”引起agetty被启动激活。
关闭“支持串口登录”、使能“支持串口”,问题得到解决。此刻,我从树莓派向外部设备发出指令、已经可以正常的接收到预期的回复内容了。
以上是我关于当前这个问题产生的整个过程的记录、猜测,以及解决方法。