环境: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<len;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<len;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,不然会出现一定概率数据出错的问题,经过多天分析,一直看不准是发送错误还是接受错误,最后快要放弃的时候主从机都修改了,一直修改程序,最后发现这是主从机都需要配合的问题,搞了这么久,终于解决问题了!