www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 現(xiàn)在大部分的儀器設(shè)備都要求能過通過上位機(jī)軟件來操作,這樣方便調(diào)試,利于操作。其中就涉及到通信的過程。在實(shí)際制作的幾個(gè)設(shè)備中,筆者總結(jié)出了通信程序的通用寫法,包括上位機(jī)端和下位機(jī)端等 1.

現(xiàn)在大部分的儀器設(shè)備都要求能過通過上位機(jī)軟件來操作,這樣方便調(diào)試,利于操作。其中就涉及到通信的過程。在實(shí)際制作的幾個(gè)設(shè)備中,筆者總結(jié)出了通信程序通用寫法,包括上位機(jī)端和下位機(jī)端等

1. 自定義數(shù)據(jù)通信協(xié)議

這里所說的數(shù)據(jù)協(xié)議是建立在物理層之上的通信數(shù)據(jù)包格式。所謂通信的物理層就是指我們通常所用到的RS232、RS485、紅外、光纖、無線等等通信方式。在這個(gè)層面上,底層軟件提供兩個(gè)基本的操作函數(shù):發(fā)送一個(gè)字節(jié)數(shù)據(jù)、接收一個(gè)字節(jié)數(shù)據(jù)。所有的數(shù)據(jù)協(xié)議全部建立在這兩個(gè)操作方法之上。


通信中的數(shù)據(jù)往往以數(shù)據(jù)包的形式進(jìn)行傳送的,我們把這樣的一個(gè)數(shù)據(jù)包稱作為一幀數(shù)據(jù)。類似于網(wǎng)絡(luò)通信中的TCPIP協(xié)議一般,比較可靠的通信協(xié)議往往包含有以下幾個(gè)組成部分:幀頭、地址信息、數(shù)據(jù)類型、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)塊、校驗(yàn)碼、幀尾。

幀頭和幀尾用于數(shù)據(jù)包完整性的判別,通常選擇一定長(zhǎng)度的固定字節(jié)組成,要求是在整個(gè)數(shù)據(jù)鏈中判別數(shù)據(jù)包的誤碼率越低越好。減小固定字節(jié)數(shù)據(jù)的匹配機(jī)會(huì),也就是說使幀頭和幀尾的特征字節(jié)在整個(gè)數(shù)據(jù)鏈中能夠匹配的機(jī)會(huì)最小。通常有兩種做法,一、減小特征字節(jié)的匹配幾率。二、增加特征字節(jié)的長(zhǎng)度。通常選取第一種方法的情況是整個(gè)數(shù)據(jù)鏈路中的數(shù)據(jù)不具有隨即性,數(shù)據(jù)可預(yù)測(cè),可以通過人為選擇幀頭和幀尾的特征字來避開,從而減小特征字節(jié)的匹配幾率。使用第二種方法的情況更加通用,適合于數(shù)據(jù)隨即的場(chǎng)合。通過增加特征字節(jié)的長(zhǎng)度減小匹配幾率,雖然不能夠完全的避免匹配的情況,但可以使匹配幾率大大減小,如果碰到匹配的情況也可以由校驗(yàn)碼來進(jìn)行檢測(cè),因此這種情況在絕大多說情況下比較可靠。

地址信息主要用于多機(jī)通信中,通過地址信息的不同來識(shí)別不同的通信終端。在一對(duì)多的通信系統(tǒng)中,可以只包含目的地址信息。同時(shí)包含源地址和目的地址則適用于多對(duì)多的通信系統(tǒng)。

數(shù)據(jù)類型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)塊是主要的數(shù)據(jù)部分。數(shù)據(jù)類型可以標(biāo)識(shí)后面緊接著的是命令還是數(shù)據(jù)。數(shù)據(jù)長(zhǎng)度用于指示有效數(shù)據(jù)的個(gè)數(shù)。

校驗(yàn)碼則用來檢驗(yàn)數(shù)據(jù)的完整性和正確性。通常對(duì)數(shù)據(jù)類型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)塊三個(gè)部分進(jìn)行相關(guān)的運(yùn)算得到。最簡(jiǎn)單的做法可是對(duì)數(shù)據(jù)段作累加和,復(fù)雜的也可以對(duì)數(shù)據(jù)進(jìn)行CRC運(yùn)算等等,可以根據(jù)運(yùn)算速度、容錯(cuò)度等要求來選取。

2. 上位機(jī)和下位機(jī)中的數(shù)據(jù)發(fā)送

物理通信層中提供了兩個(gè)基本的操作函數(shù),發(fā)送一個(gè)字節(jié)數(shù)據(jù)則為數(shù)據(jù)發(fā)送的基礎(chǔ)。數(shù)據(jù)包的發(fā)送即把數(shù)據(jù)包中的左右字節(jié)按照順序一個(gè)一個(gè)的發(fā)送數(shù)據(jù)而已。當(dāng)然發(fā)送的方法也有不同。

在單片機(jī)系統(tǒng)中,比較常用的方法是直接調(diào)用串口發(fā)送單個(gè)字節(jié)數(shù)據(jù)的函數(shù)。這種方法的缺點(diǎn)是需要處理器在發(fā)送過程中全程參與,優(yōu)點(diǎn)是所要發(fā)送的數(shù)據(jù)能夠立即的出現(xiàn)在通信線路上,能夠立即被接收端接收到。另外一種方法是采用中斷發(fā)送的方式,所有需要發(fā)送的數(shù)據(jù)被送入一個(gè)緩沖區(qū),利用發(fā)送中斷將緩沖區(qū)中的數(shù)據(jù)發(fā)送出去。這種方法的優(yōu)點(diǎn)是占用處理器資源小,但是可能出現(xiàn)需要發(fā)送的數(shù)據(jù)不能立即被發(fā)送的情況,不過這種時(shí)延相當(dāng)?shù)男?。?duì)于51系列單片機(jī),比較傾向于采用直接發(fā)送的方式,采用中斷發(fā)送的方式比較占用RAM資源,而且對(duì)比直接發(fā)送來說也沒有太多的優(yōu)點(diǎn)。以下是51系列單片機(jī)中發(fā)送單個(gè)字節(jié)的函數(shù)。

void SendByte(unsigned char ch)

{

SBUF = ch;

while(TI == 0);

TI = 0;

}

上位機(jī)中關(guān)于串口通信的方式也有多種,這種方式不是指數(shù)據(jù)有沒有緩沖的問題,而是操作串口的方式不同,因?yàn)镻C上數(shù)據(jù)發(fā)送基本上都會(huì)被緩沖后再發(fā)送。對(duì)于編程來說操作串口有三種方式,一、使用Windows系統(tǒng)中自帶的串口通信控件,這種方式使用起來比較簡(jiǎn)單,需要注意的是接收時(shí)的阻塞處理和線程機(jī)制。二、使用系統(tǒng)的API直接進(jìn)行串口數(shù)據(jù)的讀取,在windows和linux系統(tǒng)中,設(shè)備被虛擬為文件,只需要利用系統(tǒng)提供的API函數(shù)即可進(jìn)行串口數(shù)據(jù)的發(fā)送和讀取。三、使用串口類進(jìn)行串口操作。在此只介紹windows環(huán)境下利用串口類編程的方式。

CSERialport是比較好用的串口類。它提供如下的串口操作方法:

void WriteToPort(char* string, int len);

串口初始化成功后,調(diào)用此函數(shù)即可向串口發(fā)送數(shù)據(jù)。為了避免串口緩沖所帶來的延時(shí),可以開啟串口的沖刷機(jī)制。

3. 下位機(jī)中的數(shù)據(jù)接收和協(xié)議解析

下位機(jī)接收數(shù)據(jù)也有兩種方式,一、等待接收,處理器一直查詢串口狀態(tài),來判斷是否接收到數(shù)據(jù)。二、中斷接收。兩種方法的優(yōu)缺點(diǎn)在此前的一篇關(guān)于串口通信的文章中詳細(xì)討論過。得出的結(jié)論是采用中斷接收的方法比較好。

數(shù)據(jù)包的解析過程可以設(shè)置到不同的位置。如果協(xié)議比較簡(jiǎn)單,整個(gè)系統(tǒng)只是處理一些簡(jiǎn)單的命令,那么可以直接把數(shù)據(jù)包的解析過程放入到中斷處理函數(shù)中,當(dāng)收到正確的數(shù)據(jù)包的時(shí)候,置位相應(yīng)的標(biāo)志,在主程序中再對(duì)命令進(jìn)行處理。如果協(xié)議稍微復(fù)雜,比較好的方式是將接收的數(shù)據(jù)存放于緩沖區(qū)中,主程序讀取數(shù)據(jù)后進(jìn)行解析。也有兩種方式交叉使用的,比如一對(duì)多的系統(tǒng)中,首先在接收中斷中解析“連接”命令,連接命令接收到后主程序進(jìn)入設(shè)置狀態(tài),采用查詢的方式來解析其余的協(xié)議。

以下給出具體的實(shí)例。在這個(gè)系統(tǒng)中,串口的命令非常簡(jiǎn)單。所有的協(xié)議全部在串口中斷中進(jìn)行。數(shù)據(jù)包的格式如下:

0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D

其中0x55, 0xAA, 0x7E為數(shù)據(jù)幀的幀頭,0x0D為幀尾,0x12為設(shè)備的目的地址,0xF0為源地址,0x02為數(shù)據(jù)長(zhǎng)度,后面接著兩個(gè)數(shù)據(jù)0x23, 0x45,從目的地址開始結(jié)算累加、異或校驗(yàn)和,到數(shù)據(jù)的最后一位結(jié)束。


協(xié)議解析的目的,首先判斷數(shù)據(jù)包的完整性,正確性,然后提取數(shù)據(jù)類型,數(shù)據(jù)等數(shù)據(jù),存放起來用于主程序處理。代碼如下:

if(state_machine == 0) // 協(xié)議解析狀態(tài)機(jī)

{

if(rcvdat == 0x55) // 接收到幀頭第一個(gè)數(shù)據(jù)

state_machine = 1;

else

state_machine = 0; // 狀態(tài)機(jī)復(fù)位

}

else if(state_machine == 1)

{

if(rcvdat == 0xAA) // 接收到幀頭第二個(gè)數(shù)據(jù)

state_machine = 2;

else

state_machine = 0; // 狀態(tài)機(jī)復(fù)位

}

else if(state_machine == 2)

{

if(rcvdat == 0x7E) // 接收到幀頭第三個(gè)數(shù)據(jù)

state_machine = 3;

else

state_machine = 0; // 狀態(tài)機(jī)復(fù)位

}

else if(state_machine == 3)

{

sumchkm = rcvdat; // 開始計(jì)算累加、異或校驗(yàn)和

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; // 接收數(shù)據(jù)計(jì)數(shù)器

rcvcount = rcvdat; // 接收數(shù)據(jù)長(zhǎng)度

sumchkm += rcvdat;

xorchkm ^= rcvdat;

state_machine = 6;

}

else if(state _machine == 6 || state _machine == 7)

{

m_ucData[lencnt++] = rcvdat; // 數(shù)據(jù)保存

sumchkm += rcvdat;

xorchkm ^= rcvdat;

if(lencnt == rcvcount) // 判斷數(shù)據(jù)是否接收完畢

state_machine = 8;

else

state_machine = 7;

}

else if(state_machine == 8)

{

if(sumchkm == rcvdat) // 判斷累加和是否相等

state_machine = 9;

else

state_machine = 0;

}

else if(state_machine == 9)

{

if(xorchkm == rcvdat) // 判斷異或校驗(yàn)和是否相等

state_machine = 10;

else

state_machine = 0;

}

else if(state_machine == 10)

{

if(0x0D == rcvdat) // 判斷是否接收到幀尾結(jié)束符

{

retval = 0xaa; // 置標(biāo)志,表示一個(gè)數(shù)據(jù)包接收到

}

state_machine = 0; // 復(fù)位狀態(tài)機(jī)

}

此過程中,使用了一個(gè)變量state_machine作為協(xié)議狀態(tài)機(jī)的轉(zhuǎn)換狀態(tài),用于確定當(dāng)前字節(jié)處于一幀數(shù)據(jù)中的那個(gè)部位,同時(shí)在接收過程中自動(dòng)對(duì)接收數(shù)據(jù)進(jìn)行校驗(yàn)和處理,在數(shù)據(jù)包接收完的同時(shí)也進(jìn)行了校驗(yàn)的比較。因此當(dāng)幀尾結(jié)束符接收到的時(shí)候

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

當(dāng)?shù)貢r(shí)間 9 月 8 日,SpaceX 與 EchoStar 正式達(dá)成一項(xiàng)價(jià)值 170 億美元的頻譜交易,SpaceX 將收購(gòu) EchoStar 旗下 AWS-4 頻段(2GHz 頻段)及 H 頻段的頻譜許可證,此舉引發(fā)...

關(guān)鍵字: SpaceX EchoStar 星鏈 通信

在這篇文章中,小編將對(duì)PLC的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來閱讀以下內(nèi)容吧。

關(guān)鍵字: PLC 模塊化 程序

在現(xiàn)代工業(yè)和汽車領(lǐng)域,控制器局域網(wǎng)(CAN)總線作為一種可靠且高效的通信方式,廣泛應(yīng)用于各種電子設(shè)備之間的數(shù)據(jù)傳輸。在 CAN 總線系統(tǒng)中,有一個(gè)看似毫不起眼卻至關(guān)重要的元件 ——120Ω 終端電阻。這個(gè)小小的電阻,對(duì)于...

關(guān)鍵字: 控制器局域網(wǎng) 總線 通信

8月14日消息,今天,國(guó)務(wù)院新聞辦公室舉行“高質(zhì)量完成‘十四五’規(guī)劃”系列主題新聞發(fā)布會(huì),國(guó)家數(shù)據(jù)局介紹“十四五”時(shí)期數(shù)字中國(guó)建設(shè)發(fā)展成就。

關(guān)鍵字: 算力 通信

北京2025年8月8日 /美通社/ -- 8月7日,浪潮信息發(fā)布面向萬億參數(shù)大模型的超節(jié)點(diǎn)AI服務(wù)器"元腦SD200"。該產(chǎn)品基于浪潮信息創(chuàng)新研發(fā)的多主機(jī)低延遲內(nèi)存語(yǔ)義通信架構(gòu),以開放系統(tǒng)設(shè)計(jì)向上擴(kuò)展...

關(guān)鍵字: 模型 節(jié)點(diǎn) SD 通信

在現(xiàn)代通信技術(shù)的復(fù)雜網(wǎng)絡(luò)中,射頻(RF)濾波器猶如一位幕后英雄,雖鮮少被大眾提及,卻發(fā)揮著舉足輕重的作用。從我們?nèi)粘J褂玫闹悄苁謾C(jī),到構(gòu)建通信基礎(chǔ)設(shè)施的基站,再到新興的物聯(lián)網(wǎng)設(shè)備,RF 濾波器無處不在,默默保障著信號(hào)的順...

關(guān)鍵字: 射頻 濾波器 通信

在當(dāng)今數(shù)字化時(shí)代,5G 通信技術(shù)以前所未有的速度改變著我們的生活,從高速的數(shù)據(jù)傳輸?shù)綄?shí)時(shí)的物聯(lián)網(wǎng)應(yīng)用,5G 的影響力無處不在。然而,在這一系列令人矚目的技術(shù)背后,有一個(gè)常常被忽視卻至關(guān)重要的角色 —— 晶振。它如同幕后的...

關(guān)鍵字: 通信 數(shù)據(jù)傳輸 晶振

德國(guó)斯圖加特 2025年7月2日 /美通社/ -- 國(guó)際關(guān)鍵通信協(xié)會(huì)The Critical Communications Association (以下簡(jiǎn)稱TCCA)宣布...

關(guān)鍵字: 通信 TETRA TC 測(cè)試流程

近日,歐洲統(tǒng)一專利法院曼海姆分庭更新的一則訴訟信息,引發(fā)了全球科技界震動(dòng)——聯(lián)發(fā)科子公司HFI Innovation起訴了華為旗下五家子公司侵犯其LTE專利EP2689624。這場(chǎng)訴訟標(biāo)志著兩家科技巨頭持續(xù)兩年的專利糾紛...

關(guān)鍵字: 通信

為了進(jìn)一步推動(dòng)電子通信半導(dǎo)體產(chǎn)業(yè)創(chuàng)新發(fā)展,“EIS 2025 中國(guó)電子通信半導(dǎo)體數(shù)智創(chuàng)新峰會(huì)", 以 “智聯(lián)萬物·芯創(chuàng)未來 ”為主題, 將于 2025 年 10月 24日在上海隆重舉辦。

關(guān)鍵字: 通信 半導(dǎo)體
關(guān)閉