久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6252|回復: 2
打印 上一主題 下一主題
收起左側(cè)

簡單協(xié)議

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:18429 發(fā)表于 2010-6-2 17:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

//串口接收中斷函數(shù)
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 ; //如果串口接收的數(shù)據(jù)達到INBUF_LEN個,且校驗沒錯,
//就置位取數(shù)標志
}
}
}
}

 

在簡單通信協(xié)議里面使用串口工具和開發(fā)板子相連接,為什么當串口發(fā)送16進制的

4位數(shù)  95 10 20 25

單片機收到后并轉(zhuǎn)發(fā)回來。

為什么我怎么也沒法把95 10 20 25通過上面的算法得到

read_flag= 1

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2010-6-3 02:49 | 只看該作者

   你說的是這個程序吧:http://www.zg4o1577.cn/bbs/dpj-3033-1.html  
 
   首先來理解程序開頭的這句話的意思:“通信協(xié)議: 第1字節(jié),MSB為1,為第1字節(jié)標志,第2字節(jié),MSB為0,為非第一字節(jié)標志,其余類推……,最后一個字節(jié)為前幾個字節(jié)后7位的異或校驗和”
  這里說的MSB就是指字節(jié)的最高位!白詈笠粋字節(jié)為前幾個字節(jié)后7位的異或校驗和”也就是說他把每個字節(jié)的最高位當作首字節(jié)的標志用了,因而每個字節(jié)所能表示的數(shù)只有0-127(7個bit),至于最高位的那一個bit,只和是否為首字節(jié)有關(guān),只有首字節(jié)的最高位為“1”其他的字節(jié)最高位都為“0”。

再來看程序,我這里加上一些注釋。
//串口接收中斷函數(shù) 
void serial () interrupt 4 using 3  //串口中斷號為4,后面的using為寄存器組切換

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

unsigned char ch;  //在這里定義了一個 字符變量 “ch”
RI = 0 ;  //清標志位
ch=SBUF;  //這里把接收到的數(shù)據(jù)從串口緩存讀到了變量ch里
if (ch> 127 )  //注意這里,ch>127的話其最高位必須是1才可以。也就是說,只有首字節(jié)才并且必然大于127。換句話說在這里判斷了首字節(jié)
{  //是首字節(jié)的話。。。
count3= 0 ;   //給count3賦初值,這個count3就是用來計數(shù)接收到的字符的個數(shù)的。
inbuf1[count3]=ch;   //把接收到的數(shù)據(jù)放到字符串inbuf1[]中,這inbuf1[]他定義的是全局變量,因而可以傳回去。(他好像忘了去掉最高位的首字節(jié)標志了)
checksum= ch- 128 ;  //這就是計算所謂的校驗和了吧,先把首位放進去,之所以減了個128就是要把最高位的標志減掉,只計算后七位的校驗和。

else     //不是首字節(jié)的話。。。

count3++;    //接收計數(shù)自增
inbuf1[count3]=ch;   //隨著每次count3的自增,依次把接收到的數(shù)據(jù)放到字符串inbuf1[]中
checksum ^= ch;  //依次按位異或,也就是說每收到一個字節(jié)都拿來異或一下。
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )  //邏輯表達式有點長啊,最外層是與,每個元素都為真才可以,前面count3==(INBUF_LEN- 1 )也就是說接收到了最后一個字符(他定義的INBUF_LEN =4,count3從0加到3,一共接收了四個字符),后面!checksum當依次按位異或的結(jié)果歸0時才為真。

read_flag= 1 ; //如果串口接收的數(shù)據(jù)達到INBUF_LEN個,且校驗沒錯, 
//就置位取數(shù)標志 



 

 
“95 10 20 25” 這是四個字節(jié)的16進制數(shù),全都轉(zhuǎn)成二進制的數(shù)字看的清楚。
95——10010101
10——00010000
20——00100000
25——00100101
看到了吧,只有第一個0x95的最高位是1。其他的幾個字節(jié)最高位都是0。
至于校驗和,你查查每一縱列的1是不是都是偶數(shù)個(當然除了第一列)?偶數(shù)個1異或就是0。

按照這個格式,如果你發(fā)送 95 11 20 24 ,依然能得到返回數(shù)據(jù).
95——10010101
11——00010001
20——00100000
24——00100100


不知道這樣解釋樓主是否明白了?

回復

使用道具 舉報

板凳
ID:18429 發(fā)表于 2010-6-3 13:25 | 只看該作者

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

我把95轉(zhuǎn)換成10進制為149-128=21  就直接用0010 0001

結(jié)果21是10進制。

當然我是特別奇怪感覺自己完全沒法接收因為檢查了很多次。

可見自己檢查的思路老是按到自己思路走!

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品观看 | 在线免费小视频 | 伊人色综合久久久天天蜜桃 | 国产欧美精品区一区二区三区 | 日韩欧美精品一区 | 久久亚洲视频 | 欧美亚洲一级 | 电影午夜精品一区二区三区 | 一区二区三区精品视频 | 久草资源网站 | 久久成人人人人精品欧 | 成人在线观看免费爱爱 | 日韩三级在线观看 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 亚洲综合色网站 | 一级毛片免费 | 国产性色视频 | 国产精品成人国产乱一区 | 亚洲欧美高清 | 国产在线视频一区 | 三极网站 | 天天干天天操 | 国产成人一区二区三区久久久 | 视频一区二区三区中文字幕 | 在线视频一区二区三区 | 成人精品一区二区三区中文字幕 | 激情a| 免费在线观看一区二区 | 久久精品 | 午夜免费av| 久久久高清 | 午夜av影院| 精品亚洲一区二区三区 | 亚洲成人免费视频 | 国产日韩欧美一区二区在线播放 | 三区在线观看 | 成人免费毛片片v | 亚洲一区二区三区在线 | 亚洲色图综合网 | 一区二区在线免费观看 | 99热在这里只有精品 |