一種基于狀態(tài)機(jī)的串口通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
下位機(jī)采用ATMEL公司的AVR系列單片機(jī)ATmega168作為其核心控制單元;上位機(jī)軟件采用Delphi 7.0編寫(xiě),Delphi 7.0是Borland公司開(kāi)發(fā)的基于Windows平臺(tái)的面向?qū)ο蟮目焖賾?yīng)用程序開(kāi)發(fā)工具。本協(xié)議上位機(jī)程序采用Delphi開(kāi)發(fā),主要考慮到Delphi易于實(shí)現(xiàn)多線程編程。另外,Delphi開(kāi)發(fā)程序的簡(jiǎn)單、高效,也是上位機(jī)軟件選擇其作為開(kāi)發(fā)工具的重要原因。
串口通信協(xié)議包括發(fā)送與接收兩部分。在本系統(tǒng)中,下位機(jī)負(fù)責(zé)發(fā)送數(shù)據(jù),上位機(jī)負(fù)責(zé)接收數(shù)據(jù),而另一種情況:下位機(jī)接收、上位機(jī)發(fā)送,其處理方法與前面一種相似。因此,這里僅介紹下位機(jī)發(fā)送數(shù)據(jù)、上位機(jī)負(fù)責(zé)接收數(shù)據(jù)的實(shí)現(xiàn)。
下位機(jī)串口通信發(fā)送程序由于不考慮狀態(tài)機(jī),實(shí)現(xiàn)較為簡(jiǎn)單,其示例代碼如下:
上位機(jī)軟件中,當(dāng)接收到數(shù)據(jù)時(shí),串口控件會(huì)觸發(fā)一個(gè)事件,在事件處理代碼中應(yīng)及時(shí)將收到的數(shù)據(jù)存入接收沖區(qū),同時(shí)不應(yīng)該把串口通信協(xié)議接收部分的代碼放置在此事件中,否則后面到來(lái)的數(shù)據(jù)可能因?yàn)榍懊嫦鹊降臄?shù)據(jù)沒(méi)有及時(shí)處理完畢而被沖掉,導(dǎo)致數(shù)據(jù)丟失。因此,在上位機(jī)軟件運(yùn)行時(shí),應(yīng)該啟動(dòng)一個(gè)Windows線程,用于不斷檢測(cè)接收緩沖區(qū)是否為空,不為空時(shí)則對(duì)緩沖中的數(shù)據(jù)進(jìn)行處理,創(chuàng)建一個(gè)名為TBufferThread的線程類:
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評(píng)論