搞了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...