Arduino自定義通訊協議解析

2021-07-10 07:03:07 字數 3377 閱讀 8420

給出了通訊協議的設計。通訊協議的格式如下:

協議首部

指令長度

控制指令

校驗和

「控制指令」設計成如下格式:

裝置型別

裝置號埠號

比如說上位機傳送如下的格式的資料:aa0305020106,意思就是協議的首部為aa,指令長度為03,控制指令為050201:實際意義就是裝置型別為05,裝置號為02,埠為01,這三個資料的校驗和為06.現在需要寫乙個類庫,稱為protocolparser,來解析上述格式的資料。思路也很簡單,就是將串列埠傳送的資料存起來,再解析該資料各個欄位的含義即可。類庫採用c++寫的,物件導向的風格。

protocolparser.h的原始碼如下:

#ifndef protocolparser_h

#define protocolparser_h

/*自定義的庫函式

協議解析器 v1.0

解析的資料格式:

協議首部-指令長度-控制指令-校驗和

"控制指令"格式:

裝置型別-裝置號-埠號

*/#include#include//#include //#pragma warning(disable:4996)

#define buffer_size 128//假定接收資料的最大長度為128

class protocolparser

;//建構函式初始化,header為協議首部

protocolparser::protocolparser(char *header)

protocolparser::~protocolparser()

#endif

protocolparser.cpp的原始碼如下:

/*

protocolparser類的各個函式的實現

*/#include "protocolparser.h"

//#include using namespace std;

//獲取協議首部指定索引的字元,這裡預設首部為乙個位元組,比如說為0xaa

char protocolparser::getheader(size_t index)

//獲取「控制指令」欄位的長度,通過接收到的資料的第2、3位的值獲取

size_t protocolparser::getcmdlength()

return m_ncmdlength;

}//獲取實際接收到的校驗和

size_t protocolparser::getchecksum()

//從buffer中解析出裝置型別

size_t protocolparser::getdevicetype()

//從buffer中解析出裝置號

size_t protocolparser::getdevicenumber()

//從buffer中解析出埠號

size_t protocolparser::getport()

//將從串列埠接收的字串存入buffer中

if (m_nrecvdataindex==(getcmdlength()*2+5))//達到了索引值

if (chksum==getchecksum())//判斷實際接收到的校驗和跟計算出來的校驗和是否相等

else//不相等說明出錯了

buffer[0] = '\0';

m_bincmd = false;

m_nrecvdataindex = 0;

m_nchecksum=0;

} else if (m_bincmd)//指令未接收完畢 }

}/*int main()

return 0;

}*/

為了驗證**的正確性,有兩種方式,一種是將其匯入arduino ide中,形成自定義的類庫,直接呼叫相關的介面即可;另一種就是修改一下**,直接貼上到arduino ide中,編譯執行即可。這裡採用第二種方式,在arduino ide中直接修改的原始碼如下:

/*

自定義的庫函式:

協議解析器 v1.0

解析的資料格式:

協議首部-指令長度-控制指令-校驗和

"控制指令"格式:

裝置型別-裝置號-埠號

*/#include#include//#pragma warning(disable:4996)

#define buffer_size 128//假定接收資料的最大長度為128

class protocolparser

;//建構函式初始化,header為協議首部

protocolparser::protocolparser(char *header)

protocolparser::~protocolparser()

char protocolparser::getheader(size_t index)

//獲取「控制指令」欄位的長度,通過接收到的資料的第2、3位的值獲取

size_t protocolparser::getcmdlength()

return m_ncmdlength;

}//獲取實際接收到的校驗和

size_t protocolparser::getchecksum()

//從buffer中解析出裝置型別

size_t protocolparser::getdevicetype()

//從buffer中解析出裝置號

size_t protocolparser::getdevicenumber()

//從buffer中解析出埠號

size_t protocolparser::getport()

//將從串列埠接收的字串存入buffer中

if (m_nrecvdataindex==(getcmdlength()*2+5))//達到了索引值

if (chksum==getchecksum())//判斷實際接收到的校驗和跟計算出來的校驗和是否相等

else//不相等說明出錯了

buffer[0] = '\0';

m_bincmd = false;

m_nrecvdataindex = 0;

m_nchecksum = 0;

} else if (m_bincmd)//指令未接收完畢 }

}//int led=13;

char value;

protocolparser protocolparser(170);

void setup()

void loop()

}

編譯執行上傳到板子上以後,在串列埠除錯助手中除錯結果如下圖:

自定義通訊協議 網摘

現在大部分的儀器裝置都要求能過通過上位機軟體來操作,這樣方便除錯,利於操作。其中就涉及到通訊的過程。在實際製作的幾個裝置中,筆者總結出了通訊程式的通用寫法,包括上位機端和下位機端等。1 自定義資料通訊協議 這裡所說的資料協議是建立在物理層之上的通訊資料報格式。所謂通訊的物理層就是指我們通常所用到的r...

Arduino通訊協議設計

最近在一直在研究arduino 硬體平台的東西,先從做乙個簡單的東西入手,比如說,我通過android端向arduino硬體傳送指令,控制電機的正轉 反轉。其中乙個必不可少的問題就是這兩個端裝置之間的通訊問題。它們之間的通訊可以通過藍芽模組來完成,此外,還需要自己設計通訊協議。從最簡單的模組開始,需...

簡單高效可靠的自定義通訊協議(傳輸協議)

取 高效簡單可靠 這幾個形容詞還是很虛的,畢竟這是yy出來的東西。設計的目的在於 在收發雙方能夠正常執行的情況下,盡可能高的利用網路傳輸能力 不使用一應一答 以及提高傳輸效率 無須對每個報文幀進行應答 對比xmodem kermit,以及借鑑tcp的協議棧設計思想,設計一套通訊協議 1,定義傳送方s...