项目中使用STM32 UART连接SN75176与外界实现485通讯,通过一个单独GPIO管脚控制485 传输方向(DE/RE),UART设置为波特率9600,数据位8,停止位1,校验位0。
通讯过程中发现向串口输出一组数据后,UART中断总会接收到一个字节0x00,而上位机并未发送任何数据。
示波器追踪信号发现当SN75176发送数据时,即DE(PIN3)有效时,R(PIN1)端为低电平,当发送完成切换为RE(PIN2)有效时,同时R(PIN1)由低电平转换为高电平。
根据UART传输协议,空闲时保持高电平,如果传输一个字节0x00,在上述设置下,波形表现为9个bit的低电平。
根据波形猜测UART将R(PIN1)端的最后一部分识别为一个字节0x00。
解决办法:由于RS485本来就是半双工通讯,在发送时不可能有数据接收,因此需要在发送数据时关闭UART接收中断,直到发送完成,DE切换为RE有效,做一次读数操作以清除中断标志位(该数据舍弃),然后打开UART接收中断。程序示意如下:
void USART3_send(uint8_t *p,uint32_t len)
{
uint32_t i;
uint8_t Giveup; //读数缓冲
USART_ITConfig(USART3, USART_IT_RXNE,DISABLE); //关闭中断
GPIO_SetBits(GPIOB , GPIO_Pin_12); //切换DE有效
……
发送数据
……
GPIO_ResetBits(GPIOB , GPIO_Pin_12); //切换RE有效
Giveup=USART3->DR; //被舍弃的读数
Giveup=Giveup; //避免编译器报警
USART_ITConfig(USART3, USART_IT_RXNE,ENABLE); //打开中断
}
网友评论