背景
这两天再用python刷电调的时候,遇到了必须要把DTR/DSR打开才能进行串口通信的问题,在此做个记录,也欢迎各位同道发表见解。
硬件连接
硬件连接示意图如下所示,电脑通过USB连接到Arduino,实际上是U转串,电脑所用端口为COM3.
问题描述
1.python代码与串口助手通信正常
2.串口助手和BLHeli软件与Ardunio+ESC 通信正常
3.python代码与Ardunio+ESC无法通信,读不出任何数据
问题分析
用串口监视软件对比python代码,串口助手及BLHeli软件与Arduino+ESC的建立过程,发现主要不同点在流控方面
问题解决
由于大概率是流控方面的问题,所以直接在代码中对流控进行设置。通过测试,最终确定只要在代码中将dsrdtr设为1,即可正常通信,与xonxoff及rtscts无关。
后续思考
串口用的不少,应该说用的很多,但流控接触确实比较少。之前一直认为DTR/DSR, RTS/CTS是必须有硬件连线才可以有的功能,现在看来则不然。说明对知识的掌握还是太片面了,那从头开始理一理。
1. 首先把串口引脚定义来明确下,由其是要关注下流控信号的流向。参考网址:https://arcelect.com/rs232.htm
2. 流控概念。参考网址:https://www.lammertbies.nl/comm/info/rs-232-flow-control https://www.pccompci.com/Flow_Control.html#RTS/CTS
通读后得知
- XON/XOFF一般不用于二进制数据传输,个人理解数据包含17 19的都不建议用
- DTR/DSR 主要用于通信的建立(握手)
- RTS/CTS才是专门为流控而设计的
3. 通过对以上资料的阅读,还是没有搞明白:
- 为什么只开启DTR/DSR就可以正常通信了
- 为什么xonxoff设置不起作用,至少从串口监视看,建立通讯的过程中没有起到作用
- 如果xonxoff确实没有起作用,那是否是xonxoff与dsrdtr相互配合,才真正的解决了问题