在学习485发送接收的时候,(有文章中说)在发送模式下,数据发送完成之后不能马上把发送使能拉低,需要等待一会儿(大约发送1-2位的时间,视波特率而定),等待收方确认收到停止位后,再把使能位给拉低进入接收模式。
我的疑问是,如果发送完成后不立即进入接收状态,(数据发送过去后,从机接收到主机发送的数据,会立即返回响应数据)会不会接收到的数据会不完整。那么485在发送时的程序应该如何去写呢?需要加延时吗?
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1; //设置为发送模式
delay_ms(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); //等待发送结束
delay_ms(1);//使总线在状态切换时,有一个稳定的工作过程。?????需要加吗
RS485_TX_EN=0; //设置为接收模式
}
此外,在数据接收中断里,为了保证数据接收的完整性。我采取的方法是,因为我接收的数据是固定的长度的7位字节,所以我定义了一个
计数标志。当累加到7时,表明已经接收完成,开始处理接收到的数据,并且把计数标志清零,以便下次使用。但是,感觉这样确定数据是否接收完成,
这中方法不是很好,不严谨。有时会出错,不知大家有没有好的想法,欢迎大家交流。谢谢!!!
void USART2_IRQHandler(void) //MODBUS一个字节接收中断
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
RS485_RX_CNT++; //接受一个字节累加一次,7次累加
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>