資料介紹
本文我們所述的通信協議只是指建立再物理層之上的通信數據包格式。通常是我們自行約定的具有一定順序排列的數據集合,且每一部分都有特定的含義,我們把這些數據集合借助物理層通信方式進行發送和解析。
1、自定義數據通信協議
這里所說的數據協議是建立在物理層之上的通信數據包格式。所謂通信的物理層就是指我們通常所用到的RS232、RS485、紅外、光纖、無線等等通信方式。在這個層面上,底層軟件提供兩個基本的操作函數:發送一個字節數據、接收一個字節數據。所有的數據協議全部建立在這兩個操作方法之上。
通信中的數據往往以數據包的形式進行傳送的,我們把這樣的一個數據包稱作為一幀數據。類似于網絡通信中的TCPIP協議一般,比較可靠的通信協議往往包含有以下幾個組成部分:幀頭、地址信息、數據類型、數據長度、數據塊、校驗碼、幀尾。
幀頭和幀尾用于數據包完整性的判別,通常選擇一定長度的固定字節組成,要求是在整個數據鏈中判別數據包的誤碼率越低越好。減小固定字節數據的匹配機會,也就是說使幀頭和幀尾的特征字節在整個數據鏈中能夠匹配的機會最小。通常有兩種做法,一、減小特征字節的匹配幾率。二、增加特征字節的長度。通常選取第一種方法的情況是整個數據鏈路中的數據不具有隨即性,數據可預測,可以通過人為選擇幀頭和幀尾的特征字來避開,從而減小特征字節的匹配幾率。使用第二種方法的情況更加通用,適合于數據隨即的場合。通過增加特征字節的長度減小匹配幾率,雖然不能夠完全的避免匹配的情況,但可以使匹配幾率大大減小,如果碰到匹配的情況也可以由校驗碼來進行檢測,因此這種情況在絕大多說情況下比較可靠。
地址信息主要用于多機通信中,通過地址信息的不同來識別不同的通信終端。在一對多的通信系統中,可以只包含目的地址信息。同時包含源地址和目的地址則適用于多對多的通信系統。
數據類型、數據長度和數據塊是主要的數據部分。數據類型可以標識后面緊接著的是命令還是數據。數據長度用于指示有效數據的個數。
校驗碼則用來檢驗數據的完整性和正確性。通常對數據類型、數據長度和數據塊三個部分進行相關的運算得到。最簡單的做法可是對數據段作累加和,復雜的也可以對數據進行CRC運算等等,可以根據運算速度、容錯度等要求來選取。
2、上位機和下位機中的數據發送
物理通信層中提供了兩個基本的操作函數,發送一個字節數據則為數據發送的基礎。數據包的發送即把數據包中的左右字節按照順序一個一個的發送數據而已。當然發送的方法也有不同。
在單片機系統中,比較常用的方法是直接調用串口發送單個字節數據的函數。這種方法的缺點是需要處理器在發送過程中全程參與,優點是所要發送的數據能夠立即的出現在通信線路上,能夠立即被接收端接收到。另外一種方法是采用中斷發送的方式,所有需要發送的數據被送入一個緩沖區,利用發送中斷將緩沖區中的數據發送出去。這種方法的優點是占用處理器資源小,但是可能出現需要發送的數據不能立即被發送的情況,不過這種時延相當的小。對于51系列單片機,比較傾向于采用直接發送的方式,采用中斷發送的方式比較占用RAM資源,而且對比直接發送來說也沒有太多的優點。以下是51系列單片機中發送單個字節的函數。
void SendByte(unsigned char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0;
}
上位機中關于串口通信的方式也有多種,這種方式不是指數據有沒有緩沖的問題,而是操作串口的方式不同,因為PC上數據發送基本上都會被緩沖后再發送。對于編程來說操作串口有三種方式,一、使用windows系統中自帶的串口通信控件,這種方式使用起來比較簡單,需要注意的是接收時的阻塞處理和線程機制。二、使用系統的API直接進行串口數據的讀取,在windows和linux系統中,設備被虛擬為文件,只需要利用系統提供的API函數即可進行串口數據的發送和讀取。三、使用串口類進行串口操作。在此只介紹windows環境下利用串口類編程的方式。
CSerialPort是比較好用的串口類。它提供如下的串口操作方法:
void WriteToPort(char* string, int len);
串口初始化成功后,調用此函數即可向串口發送數據。為了避免串口緩沖所帶來的延時,可以開啟串口的沖刷機制。
3、下位機中的數據接收和協議解析
下位機接收數據也有兩種方式,一、等待接收,處理器一直查詢串口狀態,來判斷是否接收到數據。二、中斷接收。兩種方法的優缺點在此前的一篇關于串口通信的文章中詳細討論過。得出的結論是采用中斷接收的方法比較好。
數據包的解析過程可以設置到不同的位置。如果協議比較簡單,整個系統只是處理一些簡單的命令,那么可以直接把數據包的解析過程放入到中斷處理函數中,當收到正確的數據包的時候,置位相應的標志,在主程序中再對命令進行處理。如果協議稍微復雜,比較好的方式是將接收的數據存放于緩沖區中,主程序讀取數據后進行解析。也有兩種方式交叉使用的,比如一對多的系統中,首先在接收中斷中解析“連接”命令,連接命令接收到后主程序進入設置狀態,采用查詢的方式來解析其余的協議。
以下給出具體的實例。在這個系統中,串口的命令非常簡單。所有的協議全部在串口中斷中進行。數據包的格式如下:
0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D
其中0x55, 0xAA, 0x7E為數據幀的幀頭,0x0D為幀尾,0x12為設備的目的地址,0xF0為源地址,0x02為數據長度,后面接著兩個數據0x23, 0x45,從目的地址開始結算累加、異或校驗和,到數據的最后一位結束。
協議解析的目的,首先判斷數據包的完整性,正確性,然后提取數據類型,數據等數據,存放起來用于主程序處理。代碼如下:
if(state_machine == 0) // 協議解析狀態機
{
if(rcvdat == 0x55) // 接收到幀頭第一個數據
state_machine = 1;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到幀頭第二個數據
state_machine = 2;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 2)
{
if(rcvdat == 0x7E) // 接收到幀頭第三個數據
state_machine = 3;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 3)
{
sumchkm = rcvdat; // 開始計算累加、異或校驗和
xorchkm = rcvdat;
if(rcvdat == m_SrcAdr) // 判斷目的地址是否正確
state_machine = 4;
else
state_machine = 0;
}
else if(state_machine == 4)
{
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(rcvdat == m_DstAdr) // 判斷源地址是否正確
state_machine = 5;
else
state_machine = 0;
}
else if(state_machine == 5)
{
lencnt = 0; // 接收數據計數器
rcvcount = rcvdat; // 接收數據長度
sumchkm += rcvdat;
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 如何利用ModBus通信協議實現觸摸屏與單片機的通信
- 如何利用MODBUS通信協議實現觸摸屏與單片機的通信和控制 18次下載
- 對單片機通信方式(中斷和輪詢)的理解
- 單片機常用的幾種通信協議
- 單片機:Modbus 通信協議介紹
- 單片機常用的幾種通信協議
- 上位機通信協議PPT課件下載 39次下載
- 51單片機串行通信的原理解析資料下載
- 小白學單片機(18) 單片機/計算機系統概述:通信接口與協議資料下載
- 單片機音樂程序的設計原理解析資料下載
- 使用Modbus串行通信協議進行單片機與觸摸屏通信的圖文及程序詳解
- modbus通信協議51單片機C語言實現免費下載 145次下載
- 51單片機IIC總線通信原理及其簡單應用資料免費下載
- PC與單片機串口通信協議 0次下載
- 一種適于單片機系統的網絡通信協議 11次下載
- 上位機與下位機通信協議的優化策略 1004次閱讀
- 簡單認識UART串行通信協議 2200次閱讀
- IP地址、端口號、通信協議的相關知識 TCP和UDP通信協議簡述 2076次閱讀
- 單片機與嵌入式系統中的通信協議 1234次閱讀
- 單片機IIC通信協議詳解 4222次閱讀
- 單片機里的程序是如何運行? 4548次閱讀
- 單片機C語言的串口通信協議資料和代碼概述 3216次閱讀
- 單片機實現多機通信的資料和程序 7857次閱讀
- 如何對STC單片機進行免掉電下載 2236次閱讀
- 單片機通信協議的應用情況 4215次閱讀
- 淺析六種常用的單片機通信協議 1.5w次閱讀
- 單片機SPI通信協議的應用 7231次閱讀
- 單片機C語言之串口通信協議 4949次閱讀
- 單片機串行口介紹,8051單片機的通信方式 1.6w次閱讀
- 掌握串口通信協議的收發過程 7.8w次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論