使用485串口方式发送、接收数据,怎么保证其发送、接收数据的完整性

2019-07-20 07:27发布

在学习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次累加

               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
HXYDJ
1楼-- · 2019-07-20 09:52
 精彩回答 2  元偷偷看……
bufangqi
2楼-- · 2019-07-20 14:35
帮自己顶一个。欢迎大家交流。
HXYDJ
3楼-- · 2019-07-20 15:55
用协议去控制比如: 头 数据长度 数据 校验 尾,接收到数据后按照协议去解析就知道收到的数据完整不完整了。
bufangqi
4楼-- · 2019-07-20 18:45
 精彩回答 2  元偷偷看……
xuyaqi
5楼-- · 2019-07-20 21:35
单片机接收,发送由硬件管理,你只管读写寄存器,modbus协议一般通过间隔时间来判断数据是否接收完整。
bufangqi
6楼-- · 2019-07-21 00:48
 精彩回答 2  元偷偷看……

一周热门 更多>