色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式系統(tǒng)中串口通信幀的同步方法研究

          嵌入式系統(tǒng)中串口通信幀的同步方法研究

          作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏

          下面給出該方法在Keil C5l中的示例程序:

          #include“regx52.h”

          #define HEAD1 0x00

          #define HEAD2 0x01

          #define LEN 0x02

          #define TYPE 0x03

          #define DATA 0x04

          #define CHECK 0x05

          unsigned char g_DatRev[BUFLEN];//接收緩沖區(qū)

          unsigned char g_cmd;

          unsigned char g_RecOk;

          void main()

          {

          while(1)

          {

          if(g_RecOk)

          {

          g_RecOk=FALSE;

          switch(g_cmd)

          {//相應(yīng)處理程序

          case: ...

          break;

          case: ...

          break;

          ...

          default:

          }

          }

          }

          }

          void SerialComm() interrupt 4

          {

          static unsigned char RecState=HEAD1;//接收狀態(tài)

          static unsigned char len=0;//已接收的數(shù)據(jù)長度

          static unsigned char CheckSum=0;//校驗和

          static unsigned char Len_total=0;//包長

          if(RI)

          {

          RI=0;

          swich(RecState)

          {

          case HEAD1:

          if(SBUF==0xAA)

          {

          RecState=HEAD2;

          }

          break;

          case HEAD2:

          if(SBUF==0x55)

          {

          RecState=LEN;

          }

          else if(SBUF==0xAA)

          {

          RecState=HEAD2;

          }

          break;

          case LEN:

          RecState=TYPE;

          Len_total=SBUF;

          CheckSum=0xAA^0x55;

          break;

          case TYPE:

          RecState=DATA;

          g_cmd=SBUF;

          CheckSum=CheckSum^SBUF;

          len=0;

          break;

          case DATA:

          g_DatRev[len]=SBUF;

          CheckSum=CheckSum^SBUF;

          len++;

          if(len>=Len_total)

          {

          RecState=CHECK;

          }

          break;

          case CHECK:

          if(CheckSum==SBUF)

          {

          g_RecOk=TRUE;

          }

          RecState=HEAD1;

          break;

          default:

          RecState=HEAD1;

          break;

          }

          }

          }

          由于采用了狀態(tài)機和消息機制的結(jié)構(gòu),上述設(shè)計思路快速有效地實現(xiàn)了串口通信的同步,而且程序結(jié)構(gòu)清晰,便于維護(hù),也易于向其他的串口通信協(xié)議移植。另外,串口中斷服務(wù)子程序中需要處理的工作很少,每個串口接收中斷平均耗時不超過20個機器周期(在單片機AT89C5l中),大大減輕了串口接收中斷服務(wù)程序的壓力,緩解了嵌入式系統(tǒng)有限資源與需求之間的矛盾,提高了嵌入式系統(tǒng)的穩(wěn)定性。

          三、結(jié)論

          從上面的分析和測試可以看出,基于有限狀態(tài)機的串口通信幀同步方法是本文中提出的3種幀方法中最優(yōu)的,結(jié)構(gòu)清晰且系統(tǒng)資源利用率高。

          對一個有著完整通信協(xié)議的串口中斷來說,因為要比較命令頭、完成校驗、解析數(shù)據(jù)等需要耗費大量的機器周期,所以嵌入式系統(tǒng)中的串口中斷服務(wù)程序設(shè)計顯得更為重要。在實際的串口通信程序中,可采用狀態(tài)機和消息機制相結(jié)合的方法,僅在中斷服務(wù)程序中設(shè)置一個標(biāo)志,而在主程序中根據(jù)相應(yīng)標(biāo)志來作處理,這樣就回避了某些中斷可能需要較長處理時間的問題。在程序結(jié)構(gòu)上,由于采用狀態(tài)機的結(jié)構(gòu),既提高了可讀性。同時又提高了運行速度,因而該方法不僅是一種很好的幀同步方法,還是一種很不錯的串口通信程序設(shè)計方法。



          上一頁 1 2 下一頁

          關(guān)鍵詞: 嵌入式系統(tǒng)串口通信幀同步方

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉