通常485通信是半双工,通过收发控制位RE/DE 转变收发状态。默认情况下是接收状态,等待数据传入。当需要发送时,先将发送使能,发送结束后再将接收使能。
当出现自发自收情况,自己发送的数据触发了自身的串口中断,可能是电路设计不一样,RE/DE控制位不是直接用芯片的引脚控制的。可以通过芯片UART寄存器控制串口的接收使能,避免自发自收。
位 3 TE:发送器使能 (Transmitter enable) ,该位使能发送器。该位由软件置 1 和清零。
0:禁止发送器
1:使能发送器
位 2 RE:接收器使能 (Receiver enable) ,该位使能接收器。该位由软件置 1 和清零。
0:禁止接收器
1:使能接收器并开始搜索起始位
如图中F4芯片的UART控制寄存器CR1中的,RE是接收使能位,串口接收数据前该位必须使能,即置1。
为了避免自发自收的情况,可以在发送前关闭接收使能,这样就不会接收到自己发送的数据了,发送结束后再重新使能。
huart3.Instance->CR1 &= ~(1<<2); //发之前关掉RE标志位, 直接关闭UART接收使能。
HAL_UART_Transmit(&huart3,(uint8_t *)pData,Size,100);
while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);
huart3.Instance->CR1 |= (1<<2); //发送结束后重新使能UART接收
此外,如果发现串口接收的数据与实际数据存在差异,可以适当降低波特率,如之前采用115200,改为9600.