利用rs485软件包进行只发不收测试,发现2个很怪异有趣的现象,请问大家这是啥原因:
1 如果RT_DEVICE_OFLAG_WRONLY
,发送9个字节一切正常;
2 如果开启 RT_DEVICE_OFLAG_WRONLY|RT_DEVICE_FLAG_DMA_TX
,且BSP_UART3_TX_USING_DMA
,发现发送9个字节,收到的字节数正确,但内容错误;
说明1和2都是修改rs485源码的connect和send函数如下图(因为原来connect函数默认是以读写且接收DMA方式打开不能修改而我只发不收;测试1若以原send函数发送则什么都收不到,断点调试在rs485_mode_set(hinst, 0)
前打断点或屏蔽该条语句都能收到,但若断点在该函数之后则收不到任何东西)。
DMA方式的串口发送rt_device_write,只是启动了DMA发送就立即返回了,这时实际数据还没有发送出去,然后后面就rs485_mode_set(hinst, 0)了。
所以使用DMA方式时须增加发送完成检测,检测到发送完成后再rs485_mode_set(hinst, 0)就没问题了。
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart
看一下UART设备V2版本,更加符合实际使用场景,可以使用发送阻塞模式打开串口
1 按照你说的,增加个完成量就行了,但要再DMA发送完成时插入一个完成量,这要再DMA完成回调中完成?
2 另一种情况是咋回事,发送的数量对,但值都随机不对?
在rs485实例结构中增加发送完成量,在串口设备的发送完成回调中释放完成量,在调用设备write后等完成量
应该在rs485_mode_set(hinst, 0)前阻塞(或超时)等待完成量吧@红枫
对
RS485组件已增加DMA接收、中断发送、DMA发送的支持,可以前往主页下载最新代码试用。https://gitee.com/qiyongzhong0/rt-thread-rs485.git