stm32下面控制RS485发送有一定概率出错的情况

环境:stm32 72M时钟 串口波特率9600 RS485芯片 发送的数据每组16byte
原程序(未修改):

//RS485 发送len个字节
//buf:发送区首地址
//len:发送的字节数
void RS485SendData(u8 *buf,u8 len)
{
    u8 t;
    RS485_TX_EN=1;          //设置为发送模式
    for(t=0;t//循环发送数据
    {          
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   
        USART_SendData(USART2,buf[t]);
    }     
    while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);     
    RS485_RX_CNT=0;
    RS485_TX_EN=0;              //设置为接收模式
}

修改后(串口发送前后都需要延时20us):

//RS485 发送len个字节
//buf:发送区首地址
//len:发送的字节数
void RS485SendData(u8 *buf,u8 len)
{
    u8 t;
    RS485_TX_EN=1;          //设置为发送模式
    for(t=0;t//循环发送数据
    {          
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
        delay_us(20); //延时20us
        USART_SendData(USART2,buf[t]);
        delay_us(20); //延时20us
    }     
    while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);     
    RS485_RX_CNT=0;
    RS485_TX_EN=0;              //设置为接收模式
}

总结:串口发送前和发送后都需要延时20us,不然会出现一定概率数据出错的问题,经过多天分析,一直看不准是发送错误还是接受错误,最后快要放弃的时候主从机都修改了,一直修改程序,最后发现这是主从机都需要配合的问题,搞了这么久,终于解决问题了!

你可能感兴趣的:(stm32下面控制RS485发送有一定概率出错的情况)