使用芯片:D211BBV
使用Luban Lite SDK版本:V1.2.0
串口模式:RS232 normal
原因分析:
串口轮循发送数据函数返回时,实际串口发送数据并没有结束。如果此时控制485芯片收发引脚,会导致最后几个字节发送失败。原因是官方SDK中串口轮询发送函数发送数据没有检测数据是否发送完成导致的。
错误现象:
解决办法:
调用hal_usart_flush函数,确保串口数据真正发送完成。
rt_device_write(serial1, 0, uart[1].tx_buf, uart[1].tx_len);
hal_usart_flush(serial1->user_data, USART_FLUSH_WRITE);
正常发送数据
最近编辑记录 lqcfly (2025-06-24 07:21:27)
离线
芯片支持RS-485硬件自动控制收发方向,即串口支持RS485模式。用硬件RS485-DE引脚不是更方便简单?
这个方式是可以,但是为了兼容以前的硬件和程序,没办法直接使用RS485模式
离线
@lqcfly
理论上就算系统回复发送已经完成,也应该延时一下吧,如果直接拉DE脚也会出现数据发送丢失的现象
离线
@lqcfly
理论上就算系统回复发送已经完成,也应该延时一下吧,如果直接拉DE脚也会出现数据发送丢失的现象
是的,flush只是确保没有缓存了,但最后一个字节可能还没发送完成。所以至多还要延时10个bit的传输时长。
还有一个方法就是RS485芯片的DE和RE引脚分开控制,让发送的同时使能RE并开启串口接收,当接收到的数据长度跟发送的一致时,表示发送已经完成。
这样做还有一个额外的功能,发送的同时接收,如果接收到数据跟发送的不一致,就表示发送有问题。
最近编辑记录 海石生风 (2025-06-28 14:28:48)
离线