給出了通訊協議的設計。通訊協議的格式如下:
協議首部
指令長度
控制指令
校驗和
「控制指令」設計成如下格式:
裝置型別
裝置號埠號
比如說上位機傳送如下的格式的資料: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...