RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串口通信協(xié)議的制定及配置流程

PoisonApple ? 來源:網(wǎng)絡(luò)整理 ? 2018-02-01 15:33 ? 次閱讀

串口通信協(xié)議

串口通信指串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。在串口通信中,常用的協(xié)議包括RS-232、RS-422和RS-485。

里以串口作為傳輸媒介,介紹下怎樣來發(fā)送接收一個(gè)完整的數(shù)據(jù)包。過程涉及到封包與解包。設(shè)計(jì)一個(gè)良好的包傳輸機(jī)制很有利于數(shù)據(jù)傳輸?shù)姆€(wěn)定性以及正確性。串口只是一種傳輸媒介,這種包機(jī)制同時(shí)也可以用于SPI,I2C的總線下的數(shù)據(jù)傳輸。在單片機(jī)通信系統(tǒng)(多機(jī)通信以及PC與單片機(jī)通信)中,是很常見的問題。

一、根據(jù)幀頭幀尾或者幀長檢測(cè)一個(gè)數(shù)據(jù)幀

1、幀頭+數(shù)據(jù)+校驗(yàn)+幀尾

這是一個(gè)典型的方案,但是對(duì)幀頭與幀尾在設(shè)計(jì)的時(shí)候都要注意,也就是說幀頭、幀尾不能在所傳輸?shù)臄?shù)據(jù)域中出現(xiàn),一旦出現(xiàn)可能就被誤判。如果用中斷來接收的話,程序基本可以這么實(shí)現(xiàn):

unsigned char recstatu;//表示是否處于一個(gè)正在接收數(shù)據(jù)包的狀態(tài)

unsigned char ccnt; //計(jì)數(shù)

unsigned char packerflag;//是否接收到一個(gè)完整的數(shù)據(jù)包標(biāo)志

unsigned char rxbuf[100];//接收數(shù)據(jù)的緩沖區(qū)

void UartHandler()

{

unsigned char tmpch;

tmpch = UARTRBR;

if(tmpch 是包頭) //檢測(cè)是否是包頭

{

recstatu = 1;

ccnt = 0 ;

packerflag = 0;

return ;

}

if(tmpch是包尾) //檢測(cè)是否是包尾

{

recstatu = 0;

packerflag = 1; //用于告知系統(tǒng)已經(jīng)接收到一個(gè)完整的數(shù)據(jù)包

return ;

}

if(recstatu ==1) //是否處于接收數(shù)據(jù)包狀態(tài)

{

rxbuf[ccnt++] = tmpch;

}

}

上面也就是接收一個(gè)數(shù)據(jù)包,但是再次提醒,包頭和包尾不能在數(shù)據(jù)域中出現(xiàn),一旦出現(xiàn)將會(huì)出現(xiàn)誤判。另外一個(gè)。數(shù)據(jù)的校驗(yàn)算法是很必要的,在數(shù)據(jù)傳輸中,由于受到干擾,很難免有時(shí)出現(xiàn)數(shù)據(jù)錯(cuò)誤,加上校驗(yàn)碼可在發(fā)現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤時(shí),可以要求數(shù)據(jù)的另一方重新發(fā)送,或是進(jìn)行簡單的丟棄處理。校驗(yàn)算法不一定要很復(fù)雜,普通的加和,異或,以及循環(huán)冗余都是可以的。我上面的接收程序在接收數(shù)據(jù)時(shí),已經(jīng)將包頭和包尾去掉,這些可以根據(jù)自己的需求加上,關(guān)鍵是要理解原理。

上述包協(xié)議出現(xiàn)了以下的幾種變種:

1.1 幀頭+數(shù)據(jù)長度+數(shù)據(jù)+校驗(yàn)值

1.2包長+校驗(yàn)值

上面兩種其實(shí)都是知道了數(shù)據(jù)包的長度,然后根據(jù)接收字節(jié)的長度來判斷一個(gè)完整的數(shù)據(jù)包。例如,定義一個(gè)數(shù)據(jù)包的長度為256字節(jié),那我們就可以一直接收,直到接收到256個(gè)字節(jié),就認(rèn)為是一個(gè)數(shù)據(jù)包。但是,會(huì)不會(huì)存在問題呢?比如說從機(jī)向主機(jī)發(fā)送數(shù)據(jù),發(fā)送了一半,掉電,重啟,開機(jī)后繼續(xù)發(fā)送,這很明顯接收到的數(shù)據(jù)就不對(duì)了,所以此時(shí)很有必要定義一個(gè)超限時(shí)間,比如我們可以維護(hù)下面這樣的一個(gè)結(jié)構(gòu)體。

struct uartrd{

char rd[ 256];

unsigned int timeout;

}

成員變量rd用來存放接收到的數(shù)據(jù)字節(jié);成員變量timeout用來維護(hù)超時(shí)值,這里主要討論這個(gè)。這個(gè)數(shù)值怎么維護(hù)呢,可以用一個(gè)定時(shí)器來維護(hù),以可以放在普通的滴答中斷里面來維護(hù),也可以根據(jù)系統(tǒng)運(yùn)行一條指令的周期,在自己的循環(huán)中來維護(hù),給其設(shè)置個(gè)初值,比如說100,當(dāng)有第一個(gè)數(shù)據(jù)到來以后,timeout在指定的時(shí)間就會(huì)減少1,減少到0時(shí),就認(rèn)為超時(shí),不論是否接收到足夠的數(shù)據(jù),都應(yīng)該拋棄。

二、根據(jù)接收超時(shí)來判斷一個(gè)數(shù)據(jù)包

2.1 數(shù)據(jù)+校驗(yàn)

核心思想是如果在達(dá)到一定的時(shí)間沒有接受到數(shù)據(jù),就認(rèn)為數(shù)據(jù)包接收完成。modbus協(xié)議里就有通過時(shí)間間隔來判斷幀結(jié)束的。具體實(shí)現(xiàn)是要使用一個(gè)定時(shí)器,在接收到第一個(gè)數(shù)據(jù)時(shí)候,開啟定時(shí)器,在接收到一個(gè)數(shù)據(jù)時(shí)候,就將定時(shí)器清零,讓定時(shí)器重新開始計(jì)時(shí),如果設(shè)定的超時(shí)時(shí)間到(超時(shí)時(shí)間長度可以設(shè)置為5個(gè)正常接收的周期),則認(rèn)為在這一段時(shí)間內(nèi)沒有接受到新的數(shù)據(jù),就認(rèn)為接收到一個(gè)完整的數(shù)據(jù)包了。流程大體如下圖所示:

串口通信協(xié)議的制定及配置流程

進(jìn)行一個(gè)簡單的小的總結(jié),上述幾種方法都還是較為常用的,在具體的實(shí)現(xiàn)上,可以根據(jù)具體的實(shí)際情況,設(shè)計(jì)出具體的通訊協(xié)議。數(shù)據(jù)校驗(yàn)位,有時(shí)候感覺不出來其重要性,但是一定要加上,對(duì)數(shù)據(jù)進(jìn)行一個(gè)相關(guān)的驗(yàn)證還是必要的?,F(xiàn)在很在MCU都帶有FIFO,DMA等功能,所以有時(shí)候利用上這些特性,可以設(shè)計(jì)出更好的通訊方式。有的人問在接受串口數(shù)據(jù)時(shí)候是應(yīng)該中斷一次接收一個(gè),還是進(jìn)入中斷后接收一段數(shù)據(jù)呢,我認(rèn)為應(yīng)該中斷接收一個(gè),因?yàn)?a target="_blank">CPU是很快的,至少對(duì)于串口是這樣,在接受每個(gè)數(shù)據(jù)的間隔期間,處理器還是可以做些其他工作的。這是在裸機(jī)下的模型。在多線程中,那就可以直接建立一個(gè)數(shù)據(jù)接收線程

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1624

    瀏覽量

    55507
  • 串口通信協(xié)議
    +關(guān)注

    關(guān)注

    2

    文章

    11

    瀏覽量

    10309
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【LabVIEW串口通信】串行通信協(xié)議的可配置轉(zhuǎn)換問題

    本帖最后由 fantek 于 2013-12-31 18:26 編輯 目前存在的問題:主機(jī)( 計(jì)算機(jī),PLC等)通過串口連接兩臺(tái)或多臺(tái)通信協(xié)議不一樣的儀器設(shè)備,而這些設(shè)備都是自定義協(xié)議,適合
    發(fā)表于 09-29 02:26

    USART串行通信協(xié)議配置流程

    USART串行通信協(xié)議STM32 USART串口介紹USART配置流程
    發(fā)表于 12-18 06:34

    怎樣使用STM32CubeMX來配置USART串口通信協(xié)議

    UART串口通信協(xié)議的工作原理是什么?怎樣使用STM32CubeMX來配置USART串口通信協(xié)議呢?
    發(fā)表于 12-06 06:53

    單線串口通信協(xié)議

    單線串口通信協(xié)議如下:需要發(fā)送的數(shù)據(jù)幀:
    發(fā)表于 12-07 08:16

    串口通信協(xié)議的相關(guān)資料分享

    目錄一、串口通信協(xié)議1、UART簡介2、 UART通信協(xié)議(1)起始位(2)數(shù)據(jù)幀(3)奇偶校驗(yàn)位(4)停止位(5)下個(gè)起始位(6)波特率二、STM32的USART串口
    發(fā)表于 02-22 07:16

    高效的串行通信協(xié)議制定及實(shí)現(xiàn)

    探討了一種基于串行通信的簡單、高效的通信協(xié)議制定方法。實(shí)驗(yàn)結(jié)果證明,該協(xié)議有效提高了串行通信通信
    發(fā)表于 12-03 17:22 ?18次下載
    高效的串行<b class='flag-5'>通信協(xié)議</b>的<b class='flag-5'>制定</b>及實(shí)現(xiàn)

    串口通信協(xié)議詳解

    串口是計(jì)算機(jī)上一種非常通用設(shè)備通信協(xié)議。大多數(shù)計(jì)算機(jī)包含兩個(gè)基于RS232的串口。串口同時(shí)也是儀器儀表設(shè)備通用的
    發(fā)表于 11-09 14:51 ?8697次閱讀

    一種高效的串行通信協(xié)議制定及實(shí)現(xiàn)

    一種高效的串行通信協(xié)議制定及實(shí)現(xiàn)
    發(fā)表于 11-09 18:08 ?56次下載

    基于狀態(tài)機(jī)的串口通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)

    設(shè)計(jì)并實(shí)現(xiàn)了一種基于狀態(tài)機(jī)的串口通信協(xié)議,并將此協(xié)議應(yīng)用到稱重儀表的上位機(jī)通信中。本文介紹了串口通信協(xié)議
    發(fā)表于 05-08 15:22 ?169次下載
    基于狀態(tài)機(jī)的<b class='flag-5'>串口</b><b class='flag-5'>通信協(xié)議</b>的設(shè)計(jì)與實(shí)現(xiàn)

    PC與單片機(jī)串口通信協(xié)議

    PC與單片機(jī)串口通信協(xié)議
    發(fā)表于 12-26 22:12 ?0次下載

    科爾摩根伺服驅(qū)動(dòng)器串口通信協(xié)議

    科爾摩根伺服驅(qū)動(dòng)器串口通信協(xié)議
    發(fā)表于 09-03 09:30 ?24次下載
    科爾摩根伺服驅(qū)動(dòng)器<b class='flag-5'>串口</b><b class='flag-5'>通信協(xié)議</b>

    制定通信協(xié)議,實(shí)現(xiàn)單片機(jī)與PC機(jī)通信

    單片機(jī)與PC機(jī)串口通信編程實(shí)驗(yàn)?zāi)康睦肞ROTUES仿真軟件、串口調(diào)試助手、虛擬串口,搭建單片機(jī)與PC通信仿真平臺(tái),熟悉單片機(jī)
    發(fā)表于 12-17 18:30 ?22次下載
    <b class='flag-5'>制定</b><b class='flag-5'>通信協(xié)議</b>,實(shí)現(xiàn)單片機(jī)與PC機(jī)<b class='flag-5'>通信</b>

    西門子PLC串口協(xié)議與以太網(wǎng)通信協(xié)議對(duì)比

    西門子plc品牌眾多,通信協(xié)議的類型就更多了,具體可分為串口協(xié)議和以太網(wǎng)通信協(xié)議兩大類。 串口協(xié)議
    發(fā)表于 12-30 09:13 ?1574次閱讀
    西門子PLC<b class='flag-5'>串口</b><b class='flag-5'>協(xié)議</b>與以太網(wǎng)<b class='flag-5'>通信協(xié)議</b>對(duì)比

    UART串口通信協(xié)議是什么?

    ,廣泛應(yīng)用于嵌入式領(lǐng)域。 在UART串口通信協(xié)議中,數(shù)據(jù)以字節(jié)的形式進(jìn)行傳輸。發(fā)送和接收端的通信流程如下: 1、通信波特率設(shè)置:發(fā)送端和接收
    的頭像 發(fā)表于 03-19 17:26 ?1365次閱讀

    串口通信協(xié)議解析 串口通信應(yīng)用實(shí)例

    串口通信協(xié)議解析 串口通信協(xié)議是指規(guī)定了數(shù)據(jù)包的內(nèi)容,內(nèi)容包含了起始位、主體數(shù)據(jù)、校驗(yàn)位及停止位,雙方需要約定一致的數(shù)據(jù)包格式才能正常收發(fā)數(shù)據(jù)的有關(guān)規(guī)范。以下是
    的頭像 發(fā)表于 11-21 17:03 ?480次閱讀
    RM新时代网站-首页