51微控制器自定義串列埠協議實現握手

2021-09-14 04:17:00 字數 1408 閱讀 7632

搞了2整天的協議,查閱了很多部落格,資料,對自定義資料傳輸大體都是這樣:

幀頭、位址資訊、資料型別、資料長度、資料塊、校驗碼、幀尾

那麼首先說一下吧,之前我也不是很了解這個,直到我替人做了乙個雙機通訊的的例子後,發現接收端一直是丟資料或者顯示錯誤資料,這時候,我才想到了定製自己的串列埠協議。本程式參考了堅哥的跟modbus。

接下來,我說一下自己定義的協議吧:

一幀資料總共有7個資料,分別為:

eb 01 30 xx xx 39 ed

eb 02 30 xx xx 39 ed

定義種類兩種,如上面兩行:

eb:資料頭

01、02:功能位

30、39:校驗和位

ed:資料尾

xx xx:資料位

我的程式實現功能是,當接收到資料串1時,執行led1狀態翻轉

當接收到資料串2時,執行led2狀態翻轉

首先來看個思維導圖吧:

就是這麼個思路,接下來自己看程式吧,很詳細,簡短:

#include "reg52.h"

typedef unsigned char uchar;

typedef unsigned int uint;

typedef unsigned long ulong;

sbit led1 = p1^0;

sbit led2 = p1^2;

uchar buf[10]; //資料儲存緩衝區

uchar usart_step; //用來切換程式步

uchar usart_cnt; //用來計數接收到資料的個數

uint led1_date_move;//用來了;累計計數

uint led2_date_move;

bit led1_flag;//led狀態

bit led2_flag;

void usart_init(void)

void main(void)

if(led2_flag)//標記位為1時執行狀態翻轉

}}void usart_irq() interrupt 4

}break;

case 1: //進入程式步1

}break;

case 0x02:

}break;

}}usart_step = 0;//資料解析完後,返回程式步0,執行下一幀資料

}break;}}

} else

}

51微控制器串列埠通訊

1 並行通訊 傳送方和接收方用多根資料線連線,多位資料同時傳送。傳輸線多,長距離傳輸時成本大。2 序列通訊 單根資料線傳送資料,逐位傳送。長距離傳送成本低,但控制相對複雜。序列通訊又可分為 非同步序列通訊和同步序列通訊。非同步序列通訊 所謂 非同步 指的是雙方裝置使用各自的時鐘,以字元為單位傳輸,採...

51微控制器 eeprom 串列埠

按照相應的編碼格式,對串列埠資料進行編碼,傳送至微控制器,微控制器對資料進行解析,寫入或者讀取eeprom,再返回資料至微控制器串列埠。讀取資料0x03 且只需要傳入3個16進製制數即可,寫入資料0x06,具體不超過255個資料,要想多寫入資料,可以將資料長度的值增加到兩個16進製制數,程式也需要相...

微控制器自定義串列埠空閒中斷的方法!

好久沒有發布部落格了,今天遇到個問題,串列埠接受不定長沒有空閒中斷如何處理?說下自己的方法,如果有異議還望告知謝謝!1 在串列埠終端中加入全域性變數,進入串列埠中斷賦值。void interrupt uart void uart rxdealy 3 串列埠接收延時 cnt 陣列下標 buff cnt...