3124|9

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何去除上位机和下位机的通信问题 [复制链接]

用C51编写的单片机,但是上位机和下面的单片机通信时,出现一个问题:

我设的起始位为7e,然后是命令,长度 ,数据 校验和。但是我的数据里面如果传输了一个数据和
起始位的数据时一样的,这样的话数据就通信不上,请问哪位高手可以像个办法?

我的判断是加在中断函数里进行判断的,首先是判断起始位然后就是传输数据了。

最新回复

建一个全局变量,定义为接收数据类型变量例如abc 等于0是为接收开始位,正确则abc=1. 在1中判命令 符合则abc=2否则abc=0 在2中判断长度,abc=3 在3中接收数据长度个数据,abc=4(校验) 在4中判断校验,然后无论正确与否 abc=0 校验的部分自己做一下吧!   详情 回复 发表于 2010-1-11 17:28
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
为什么要那个什么起始位?

简单些,用固定长度的包,不要在ISR里面做那个判断
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 


  1. void Receive_RS485(void) interrupt 7 using 2
  2. {
  3.         unchar temp, n;

  4.         RI1=0;                                //??????????±ê????
  5.         temp=SBUF1;

  6. //////////////// 接受标志位 //////////////////////////
  7. if(stop_flag == 0)
  8. {
  9.         if(temp==0x7e)               
  10.         {
  11.                 start_flag=1;
  12.                 length_485=0;
  13.         }                                                               
  14. //////////////// 数据接收//////////////////////////
  15.         if(start_flag==1)
  16.         {
  17.              receive_buffer_485[length_485]=temp;
  18.                  ++length_485;

  19.                 if(length_485==55)
  20.                 {
  21.                         receive_check_485=0;
  22.                         RDflag_485=1;                 
  23.                         length_485=0;                 
  24.                         for(n=1; n<54; n++)
  25.                         {
  26.                                 receive_check_485+=receive_buffer_485[n];
  27.                         }

  28.                         if(receive_check_485==receive_buffer_485[54])
  29.                         {
  30.                                 //green=0;
  31.                                 error_485=0;
  32.                                 start_flag=0;
  33.                                 length_485=0;
  34.                                 EXIF|=0x80;               
  35.                         }
  36.                         else
  37.                         {
  38.                                 start_flag=0;       
  39.                                 error_485=1;
  40.                                 length_485=0;
  41.                                 //green=1;
  42.                         }       
  43.                 }
  44.         }
  45. }
  46.         ES1=1;                                }

复制代码
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 great_bug 的回复:
为什么要那个什么起始位?

简单些,用固定长度的包,不要在ISR里面做那个判断

工程现在已经成了,要这样改会不会比较困难,因为中断涉及的内容比较广

还有其他办法吗?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
传ASIIC码就可以了,可以将数据拆分两字个ASIIC码,如0X7E拆分成‘7’和‘E’不就可以了吗》
接收端再全成一个数据就OK了。
我们做GPRS TCP传数据都是这里的。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
多加一个判断了,判断0x7e是否第一个接收到的字节
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
if(temp==0x7e)        
    {
        start_flag=1;
        length_485=0;
    }

把这里的判断条件,改为  if(temp==0x7e&&start_flag==0) 或者 if(temp==0x7e&&start_flag!=1)      
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

8
 
引用 6 楼 gioc 的回复:
if(temp==0x7e)? ? ? ?
? ? {
? ? ? ? start_flag=1;
? ? ? ? length_485=0;
? ? }

把这里的判断条件,改为? if(temp==0x7e&&start_flag==0) 或者 if(temp==0x7e&&start_flag!=1)? ? ?

厉害
我都想晕了,呵呵谢谢
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
MARK,我也看下。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
建一个全局变量,定义为接收数据类型变量例如abc
等于0是为接收开始位,正确则abc=1.
在1中判命令 符合则abc=2否则abc=0
在2中判断长度,abc=3
在3中接收数据长度个数据,abc=4(校验)
在4中判断校验,然后无论正确与否 abc=0
校验的部分自己做一下吧!
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表