下面給出該方法在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]; //接收緩衝區
unsigned char g_cmd;
unsigned char g_recok;
void main()
while(1)
if(g_recok)
g_recok=false;
switch(g_cmd)
{ //相應處理程式
case: ...
break;
case: ...
break;
default:
void serialcomm() interrupt 4
static unsigned char recstate=head1; //接收狀態
static unsigned char len=0; //已接收的資料長度
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;
由於採用了狀態機和訊息機制的結構,上述設計思路快速有效地實現了串列埠通訊的同步,而且程式結構清晰,便
於維護,也易於向其他的串列埠通訊協議移植。另外,串列埠中斷服務子程式中需要處理的工作很少,每個串列埠接收
中斷平均耗時不超過20個機器週期(在微控制器at89c5l中),大大減輕了串列埠接收中斷服務程式的壓力,緩解了嵌
入式系統有限資源與需求之間的矛盾,提高了嵌入式系統的穩定性。
三、結論
從上面的分析和測試可以看出,基於有限狀態機的串列埠通訊幀同步方法是本文中提出的3種幀方法中最優的,結
構清晰且系統資源利用率高。
對乙個有著完整通訊協議的串列埠中斷來說,因為要比較命令頭、完成校驗、解析資料等需要耗費大量的機器週期
,所以嵌入式系統中的串列埠中斷服務程式設計顯得更為重要。在實際的串列埠通訊程式中,可採用狀態機和訊息機
制相結合的方法,僅在中斷服務程式中設定乙個標誌,而在主程式中根據相應標誌來作處理,這樣就迴避了某些
中斷可能需要較長處理時間的問題。在程式結構上,由於採用狀態機的結構,既提高了可讀性。同時又提高了運
行速度,因而該方法不僅是一種很好的幀同步方法,還是一種很不錯的串列埠通訊程式設計方法。
教你使用stm32接收串列埠的一幀資料!
stm32支援接受單個資料或者一幀資料,若配置單個資料接收中斷的話,會出現接收包丟包,資料不完整的情況!因此在stm32的串列埠中斷中,還有乙個idle中斷,用來產生串列埠接受一幀資料而產生的中斷,比如說串列埠發來n個資料,會產生n次接收中斷和一次idle中斷,因此方便使用者來接收主機傳送或者從機返...
串列埠接收完整一幀資料報的3種方法
本文介紹3種使用串列埠接受一幀完整資料報的方法,串列埠接收資料是位元組接收的,串列埠每接收1位元組資料,產生乙個串列埠中斷,我們在中斷中將接收到的資料存放到buf中進行儲存,但是資料的傳送和接收都是按照幀為單位進行傳輸的,因此我們要在接收資料的同時判斷當前接收的資料是否是完整的一幀。一般串列埠完整資...
Qt獲取攝像頭畫面的每一幀資料
繼承自qabstractvideosu ce,實現它的一些虛函式,可以在實現的虛函式 present 中獲取到攝像頭畫面的一幀資料,拿到資料之後就可以轉換處理了,這裡拿到資料之後,繪製在主視窗上了。主要 首先在 pro 中加入 模組 qt core gui widgetsmainwindow.cpp...