OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8228|回复: 9

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

[复制链接]

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
发表于 2018-6-27 10:15:38 | 显示全部楼层 |阅读模式
10金钱
在学习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次累加

               

最佳答案

查看完整内容[请看2#楼]

如果从机返回来的数据格式是固定的,比如有固定的开头、和结束。就去判断当前收到的数据是不是正确的开头,如果不是就丢弃。如果是正确的开头,那么就开始存储后面接收到的数据。当数据个数够了,而且最后一个数据也是结束符,那么就标记本组数据有效,开始处理本组数据。否则就说明接收到的数据异常,丢弃本组数组,从新接收。 如果返回的数据没有固定格式,可以用时间判断,比如接收到1个数据后就开始计时,并存储接 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-6-27 10:15:39 | 显示全部楼层
本帖最后由 HXYDJ 于 2018-6-27 14:57 编辑
bufangqi 发表于 2018-6-27 14:40
您好,我用的是485-modbus协议去采集风速风向传感器的数据 信息。给从机发送的数据信息是固定的。如上面 ...

     如果从机返回来的数据格式是固定的,比如有固定的开头、和结束。就去判断当前收到的数据是不是正确的开头,如果不是就丢弃。如果是正确的开头,那么就开始存储后面接收到的数据。当数据个数够了,而且最后一个数据也是结束符,那么就标记本组数据有效,开始处理本组数据。否则就说明接收到的数据异常,丢弃本组数组,从新接收。
    如果返回的数据没有固定格式,可以用时间判断,比如接收到1个数据后就开始计时,并存储接收到的数据,如果有新的数据进来,计时清零。如果计时超过一定时间比如50ms,说明从机数据已经发送完成,这时候就可以处理接收到的数据。
   当然也可以数接收到数据的个数,接收到的数据个数够了就停止接收,这样也能用,但是通用性不好。抗干扰能力也差。
  或者从硬件上解决,把485芯片换成487芯片,487芯片硬件上可以自动转换发送和接收,当做串口用就行。程序上就不用切换接收和发送了,也不用考虑程序反应慢错过从机返回的数据。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-6-27 10:16:07 | 显示全部楼层
帮自己顶一个。欢迎大家交流。
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-6-27 10:21:03 | 显示全部楼层
用协议去控制比如: 头 数据长度 数据 校验 尾,接收到数据后按照协议去解析就知道收到的数据完整不完整了。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-6-27 14:40:04 | 显示全部楼层
HXYDJ 发表于 2018-6-27 10:21
用协议去控制比如: 头 数据长度 数据 校验 尾,接收到数据后按照协议去解析就知道收到的数据完整不完整了 ...

您好,我用的是485-modbus协议去采集风速风向传感器的数据 信息。给从机发送的数据信息是固定的。如上面所示,如果我的发送标志位USART_FLAG_TC置1.说明发送完成,当从机收到主机发给它的数据后,会返回响应数据,一共7个字节。如上所示,让RS485_RX_CNT++,当个数加到7时,说明已经接收完成从机发给主机的数据。然后再根据modbus协议去分析接收到的数据。
你看我的这个思路可行吗?有什么疏忽没?谢谢
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10848
金钱
10848
注册时间
2014-6-12
在线时间
1037 小时
发表于 2018-6-27 14:59:12 | 显示全部楼层
单片机接收,发送由硬件管理,你只管读写寄存器,modbus协议一般通过间隔时间来判断数据是否接收完整。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-6-27 16:44:17 | 显示全部楼层
HXYDJ 发表于 2018-6-27 10:15
如果从机返回来的数据格式是固定的,比如有固定的开头、和结束。就去判断当前收到的数据是不是正确 ...

谢谢,讲解真的很棒。谢谢。
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-6-27 16:44:55 | 显示全部楼层
xuyaqi 发表于 2018-6-27 14:59
单片机接收,发送由硬件管理,你只管读写寄存器,modbus协议一般通过间隔时间来判断数据是否接收完整。

嗯恩,谢谢你。
回复

使用道具 举报

13

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2014-12-24
在线时间
48 小时
发表于 2018-6-27 19:35:07 | 显示全部楼层
这个问题我也在思考,我要做一对多通信,接收从机响应数据,需要轮训,如果你是一对一,可以把485电路设计成自动收发
回复

使用道具 举报

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
 楼主| 发表于 2018-6-28 16:38:26 | 显示全部楼层
1812090658@qq.c 发表于 2018-6-27 19:35
这个问题我也在思考,我要做一对多通信,接收从机响应数据,需要轮训,如果你是一对一,可以把485电路设计 ...

我现在是一对二通信的。还是有些不完善。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-28 00:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表