找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5560|回复: 2
打印 上一主题 下一主题
收起左侧

简单协议

[复制链接]
跳转到指定楼层
楼主
ID:18429 发表于 2010-6-2 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
unsigned char ch;
RI = 0 ;
ch=SBUF;
if (ch> 127 )
{
count3= 0 ;
inbuf1[count3]=ch;
checksum= ch- 128 ;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
{
read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}

 

在简单通信协议里面使用串口工具和开发板子相连接,为什么当串口发送16进制的

4位数  95 10 20 25

单片机收到后并转发回来。

为什么我怎么也没法把95 10 20 25通过上面的算法得到

read_flag= 1

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2010-6-3 02:49 | 只看该作者

   你说的是这个程序吧:http://www.51hei.com/bbs/dpj-3033-1.html  
 
   首先来理解程序开头的这句话的意思:“通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和”
  这里说的MSB就是指字节的最高位。“最后一个字节为前几个字节后7位的异或校验和”也就是说他把每个字节的最高位当作首字节的标志用了,因而每个字节所能表示的数只有0-127(7个bit),至于最高位的那一个bit,只和是否为首字节有关,只有首字节的最高位为“1”其他的字节最高位都为“0”。

再来看程序,我这里加上一些注释。
//串口接收中断函数 
void serial () interrupt 4 using 3  //串口中断号为4,后面的using为寄存器组切换

if (RI)  //判断是否是接收中断

unsigned char ch;  //在这里定义了一个 字符变量 “ch”
RI = 0 ;  //清标志位
ch=SBUF;  //这里把接收到的数据从串口缓存读到了变量ch里
if (ch> 127 )  //注意这里,ch>127的话其最高位必须是1才可以。也就是说,只有首字节才并且必然大于127。换句话说在这里判断了首字节
{  //是首字节的话。。。
count3= 0 ;   //给count3赋初值,这个count3就是用来计数接收到的字符的个数的。
inbuf1[count3]=ch;   //把接收到的数据放到字符串inbuf1[]中,这inbuf1[]他定义的是全局变量,因而可以传回去。(他好像忘了去掉最高位的首字节标志了)
checksum= ch- 128 ;  //这就是计算所谓的校验和了吧,先把首位放进去,之所以减了个128就是要把最高位的标志减掉,只计算后七位的校验和。

else     //不是首字节的话。。。

count3++;    //接收计数自增
inbuf1[count3]=ch;   //随着每次count3的自增,依次把接收到的数据放到字符串inbuf1[]中
checksum ^= ch;  //依次按位异或,也就是说每收到一个字节都拿来异或一下。
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )  //逻辑表达式有点长啊,最外层是与,每个元素都为真才可以,前面count3==(INBUF_LEN- 1 )也就是说接收到了最后一个字符(他定义的INBUF_LEN =4,count3从0加到3,一共接收了四个字符),后面!checksum当依次按位异或的结果归0时才为真。

read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错, 
//就置位取数标志 



 

 
“95 10 20 25” 这是四个字节的16进制数,全都转成二进制的数字看的清楚。
95——10010101
10——00010000
20——00100000
25——00100101
看到了吧,只有第一个0x95的最高位是1。其他的几个字节最高位都是0。
至于校验和,你查查每一纵列的1是不是都是偶数个(当然除了第一列)?偶数个1异或就是0。

按照这个格式,如果你发送 95 11 20 24 ,依然能得到返回数据.
95——10010101
11——00010001
20——00100000
24——00100100


不知道这样解释楼主是否明白了?

回复

使用道具 举报

板凳
ID:18429 发表于 2010-6-3 13:25 | 只看该作者

谢谢,明白了。也找到原因了。

我把95转换成10进制为149-128=21  就直接用0010 0001

结果21是10进制。

当然我是特别奇怪感觉自己完全没法接收因为检查了很多次。

可见自己检查的思路老是按到自己思路走!

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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