相信有小伙伴们遇到过这样的问题,在使用GD32进行串口485发送的时候,明明发送了特定长度的数据,但从机就是不响应,现在就让我们来解析下最常见的一个原因。
我们先来看一段代码:

这是采用轮训方式进行485发送的函数,首先将485传输方向设置为发送,然后进行长度为len的数据发送,发送完成后将485传输方向设置为接收。看似这段代码没有问题,但当放在MCU上运行后发现,从机会少收到两个字节的数据。
这是因为,串口是有数据寄存器和移位寄存器,当最后一次判断TBE不为“0”并调用usart_data_transmit函数后,实际上倒数第二个字节的数据正在发送移位寄存器中对外发送,最后一个字节在数据寄存器中,此时如果将485传输方向改为接收,那么最后两个字节的数据将不会发送到485总线上。

解决这个问题的办法也很简单,只需要增加一个判断TC的过程就可以了。

TC标志位用来指示是不是所有的数据(包括数据寄存器和发送移位寄存器)都已经发送完成,如果发送完成则置“1”。
前面讲述的是使用轮训方式进行发送,如果用DMA发送和中断发送怎么办呢?其实道理是一样的,在DMA发送和中断发送两种模式中都要打开TC中断,只有进入了TC中断后,才能将传输方向切换为接收,小伙伴们明白了吗?
-
单片机
+关注
关注
6074文章
45340浏览量
663617 -
串口
+关注
关注
15文章
1607浏览量
81945 -
GD32
+关注
关注
7文章
429浏览量
26943
发布评论请先 登录
GD32和STM32单片机的区别
什么是GD32
GD32芯片包添加步骤有哪些
如何利用stm32f407+485发送modbus RTU协议
RS485发送时,影响其他串口接收?为什么呢?
STM32F103ZET6基于RS485发送接收简单例程
GD32 DMA串口通讯DEMO
stm32f407+485发送modbus RTU协议 适合初学者
GD32芯片怎么样?GD32芯片运行速度慢的原因
gd32和stm32哪个好?
GD32与STM32兼容吗?
GD32 MCU ISP失败的原因

GD32 485发送异常最常见原因
评论