黃克亞,余 雷,李曉旭
(蘇州大學(xué) 機電工程學(xué)院,江蘇 蘇州 215131)
通用同步異步收發(fā)器(Universal Synchronous/Asynchronous Receiver/Transmitter,USART),簡稱串口,為與使用工業(yè)標準NRZ 異步串行數(shù)據(jù)格式的外部設(shè)備之間進行全雙工數(shù)據(jù)交換提供了一種靈活的方法。萬物互聯(lián)使世界更加精彩,在有線數(shù)據(jù)通信中,串口無疑是一個理想選擇,其簡單高效、靈活可靠,普遍存在于各主從設(shè)備當(dāng)中。串口通信是嵌入式系統(tǒng)教學(xué)的重點和難點,需要理解其通信原理,但更重要的是在實踐中掌握其應(yīng)用方法,因此好的教學(xué)實驗設(shè)計尤為重要。串口通信實驗可以是微控制器之間、微控制器與外部設(shè)備、微控制器與上位機之間的數(shù)據(jù)交換。由于嵌入式開發(fā)都需要在PC 機上編譯應(yīng)用程序,所以大部分的串口通信項目實例都是基于微控制器和PC 機的,本設(shè)計也不例外。但是傳統(tǒng)的串口實驗往往較為簡單,不具備工程實踐意義,如PC 機向微控制器發(fā)送單個數(shù)據(jù),微控制器收到后加1 回傳;只關(guān)注通信一方,即微控制器端,PC 端借助專用調(diào)試軟件,如串口調(diào)試助手,不能幫助學(xué)生很好地理解通信雙方數(shù)據(jù)傳輸要求。為克服上述實驗設(shè)計中的不足,本文設(shè)計STM32 與PC 機USART 串口通信教學(xué)實驗。
實驗設(shè)計微控制器選擇的是STM32F103ZET6 芯片,其為SM32F1 系列大容量產(chǎn)品,外設(shè)資源豐富。實驗電路串口選擇USART1,工作于串行、異步、全雙工制式。如果需要連接2 個具有USART 接口的設(shè)備,則每個設(shè)備至少通過3 個引腳與其他設(shè)備連接在一起,分別為接收數(shù)據(jù)輸入(RxD)、發(fā)送數(shù)據(jù)輸出(TxD)、2 個設(shè)備之間的共地信號(GND),其連接方式如圖1 所示。需要注意的是,2 個USART 設(shè)備的TxD 和RxD 必須是交叉相連的。
圖1 兩個USART 設(shè)備之間的互連
USART 異步通信數(shù)據(jù)傳送按幀傳輸,一幀數(shù)據(jù)包含起始位、數(shù)據(jù)位、校驗位和停止位。最常見的幀格式由1 個起始位、8 個數(shù)據(jù)位、1 個校驗位和1 個停止位組成,幀與幀之間可以有空閑位。起始位約定為0,停止位和空閑位約定為1,典型通信時序如圖2 所示。發(fā)送和接收由一共用的波特率發(fā)生器驅(qū)動,當(dāng)發(fā)送器和接收器的使能位分別置位時,分別為其產(chǎn)生時鐘。
圖2 USART 異步通信時序圖
USART 采用的電平標準決定了它的通信距離較短,一般僅限于板級通信,早期微型計算機均配有RS 232 串口,其與微控制器的USART 相連需要配一個電平轉(zhuǎn)換芯片,如MAX232。現(xiàn)在無論是筆記本還是臺式計算機均很難找到串口,取而代之的是USB 接口的普遍使用,同時USB 接口還可以提供穩(wěn)定的5 V 電源,所以本實驗設(shè)計的MCU(微控制器)和PC 機串行通信是通過PC 機USB 口轉(zhuǎn)換成串口完成的。
圖3 所示為開發(fā)板串口通信電路,其核心為CH340G 芯片。該芯片為一個USB 總線的轉(zhuǎn)接芯片,實現(xiàn)了USB 轉(zhuǎn)串口或者USB 轉(zhuǎn)打印口。在串口方式下,CH340G 提供常用的MODEM 聯(lián)絡(luò)信號,用于為計算機擴展異步串口,或者將普通的串口設(shè)備直接升級到USB總線。通過該電路即可將PC 機的USB 口轉(zhuǎn)換為串行接口并分配端口號,PC 機通信軟件通過這一虛擬串口即可 實 現(xiàn) 數(shù) 據(jù) 透 明 傳 輸。圖3 中USART1_RxD 和USART1_TxD 分別連接微控制器串口1 的數(shù)據(jù)接收引腳和數(shù)據(jù)發(fā)送引腳。三極管Q和Q可根據(jù)聯(lián)絡(luò)信號實現(xiàn)微控制器在下載、復(fù)位、運行狀態(tài)之間的自由切換,用戶體驗非常好。
圖3 開發(fā)板串口通信電路
開發(fā)板串口通信電路既構(gòu)建了MCU 和PC 機串行數(shù)據(jù)通道,又可以為開發(fā)板提供系統(tǒng)電源,還可以將嵌入式系統(tǒng)開發(fā)平臺生成的目標程序下載到微控制器的運行存儲器當(dāng)中,具有在線編程(ISP)功能。電路集電源供電、串口通信、ISP 下載功能于一身,在開發(fā)板設(shè)計當(dāng)中獲得廣泛的應(yīng)用。
本實驗軟件設(shè)計包括兩部分程序:微控制器串口收發(fā)程序和上位機串口收發(fā)程序。兩部分程序運行于不同終端,分開設(shè)計;但相互關(guān)聯(lián),需要綜合設(shè)計,才能協(xié)同工作。首先就需要對通信數(shù)據(jù)格式、內(nèi)容和長度等進行約定,對應(yīng)網(wǎng)絡(luò)分層的頂層,屬于應(yīng)用層協(xié)議。
實驗實現(xiàn)如下功能:STM32 微控制器通過串口和上位機建立通信連接,上位機獲取本機時間,并通過串口發(fā)送給STM32 微控制器;微控制器在收到上位機發(fā)送過來的一組數(shù)據(jù)后,提取出時、分和秒的數(shù)值,顯示于數(shù)碼管上,并將收到的數(shù)據(jù)個數(shù)發(fā)送至上位機。為了使通信雙方能夠理解收發(fā)數(shù)據(jù)的含義,常見的數(shù)據(jù)通信約定方法有:
1)依數(shù)據(jù)發(fā)送順序確定數(shù)據(jù)性質(zhì),在本例中上位機將時、分、秒依次向微控制器發(fā)送,微控制器收到的數(shù)據(jù)3個為一組,每組數(shù)中第一個數(shù)據(jù)為小時數(shù)值,第二個數(shù)據(jù)為分數(shù)值,第三個數(shù)據(jù)為秒數(shù)值。該方法簡單易懂、容易實現(xiàn),無額外開銷,但是發(fā)送和接收數(shù)據(jù)數(shù)量和順序嚴格定義,若由于干擾出現(xiàn)“丟幀”現(xiàn)象,數(shù)據(jù)將會完全混亂。
2)在發(fā)送數(shù)據(jù)前加一個或多個字節(jié)的前導(dǎo)說明符,例如時數(shù)據(jù)前加一個“H”控制符,組成兩個字節(jié)數(shù)據(jù)一起發(fā)送,該方法數(shù)據(jù)發(fā)送和接收無順序限制,“丟幀”不影響數(shù)據(jù)繼續(xù)傳輸,但實現(xiàn)難度有所增加,帶來部分額外數(shù)據(jù)開銷。
考慮到上述兩種數(shù)據(jù)約定方法均存在一定的不足,結(jié)合項目實際情況,即本項目傳輸數(shù)據(jù)時、分、秒的最大數(shù)值范圍為0~59,可以使用6 位二進制表示,傳輸數(shù)據(jù)性質(zhì)共有3 種情況,可以使用2 位二進制表示,將上述兩部分數(shù)據(jù)合在一起正好是一個字節(jié),作為一幀數(shù)據(jù)在串口通信鏈路上傳輸,每幀數(shù)據(jù)位定義及格式如圖4所示。
圖4 串口通信數(shù)據(jù)幀格式
三種數(shù)據(jù)通信協(xié)議特點及性能對比如表1 所示。由表1 可以看出,本實驗設(shè)計所采用的控制位和數(shù)據(jù)位單字節(jié)組合數(shù)據(jù)幀通信格式具有簡潔、高效、靈活等眾多優(yōu)越性能,是本實驗設(shè)計的創(chuàng)新點之一。
表1 通信協(xié)議特點及性能對比
微控制器端串口通信程序是采用基于中斷的前后臺模式,沒有數(shù)據(jù)通信請求運行主程序,本實驗主程序是數(shù)字電子鐘,當(dāng)有串口數(shù)據(jù)請求時,即串口接收中斷發(fā)生,CPU 進入中斷服務(wù)程序,處理串口中斷。該模式在數(shù)據(jù)通信領(lǐng)域比較普遍,有利于提高CPU 執(zhí)行效率,并可將通信程序集成到其他模塊當(dāng)中。
3.2.1 主程序設(shè)計
主程序設(shè)計包括串口初始化和數(shù)碼管動態(tài)顯示程序兩部分。本實驗串口選用的是USART1,其操作步驟如下:
1)打開GPIOA 和USART1 的時鐘使能。
2)設(shè)置串口的I/O 口模式,要使用STM32 的USART1 必需要將其TxD(PA9)初始化為復(fù)用推挽輸出,將其RxD(PA10)初始化為浮空輸入。
3)初始化USART,通信雙方約定采用“96 N 8 1”,無硬件流控制格式,其參考程序如下:
4)開串口接收中斷,并設(shè)置NVIC 參數(shù)。
3.2.2 中斷服務(wù)程序設(shè)計
完成串口初始化程序之后,主程序即進入數(shù)碼管動態(tài)顯示時間的無限循環(huán)程序當(dāng)中。在主程序執(zhí)行過程中,若串口接收到數(shù)據(jù),CPU 響應(yīng)串口接收中斷,運行中斷服務(wù)程序,接收上位機傳來的時間數(shù)據(jù),完成全局變量更新,并返回數(shù)碼管顯示,完成一次數(shù)據(jù)通信。
中斷服務(wù)參考程序如下:
為了實現(xiàn)數(shù)字電子鐘計時和設(shè)定功能,定時器秒中斷和按鍵外部中斷正常執(zhí)行,在此不再贅述。
因為是串口通信程序設(shè)計,所以除了編寫微控制器端程序外,還需要編寫上位機控制程序。上位機程序是在個人計算機上編寫的,其開發(fā)方法和使用平臺形式各異,本文采用Visual Basic 6.0 進行串口程序設(shè)計,其他開發(fā)平臺也是類似的。
首先在VB6.0 軟件中新建一個窗體,并添加相應(yīng)控件,創(chuàng)建完成界面如圖5 所示。
圖5 串口通信窗體創(chuàng)建界面
與本項目有關(guān)的控件主要有:窗體Form1,文本框數(shù)組Text1(0)~Text1(4),狀態(tài)指示圖標shpCOM,組合列表框cboPort,串口狀態(tài)標簽cmdOpenCom,當(dāng)前時間標簽Label13,退出按鈕Command2,發(fā)送時間按鈕Command3,定時器Timer1,串口通信控件MSComm1 等。
上位機通信程序主要包括窗體載入、定時器中斷、發(fā)送時間、串口接收等。
1)窗體載入程序。窗體載入程序主要是尋找可用串口,并對有效串口進行初始化。尋找有效串口的方法是試圖打開一個串口,若成功則有效,否則尋找下一個串口。串口初始化包括設(shè)置通信格式、數(shù)據(jù)位數(shù)、事件產(chǎn)生方法等。特別注意的是,需要將串口控件DTREnable 和RTSEnable 兩個屬性值設(shè)為False,否則系統(tǒng)會強制復(fù)位。
2)定時器中斷程序。定時器設(shè)置為每秒中斷一次,每次中斷都將系統(tǒng)當(dāng)前時間更新到時間顯示標簽上。
3)發(fā)送時間程序。串口通信以二進制格式進行時,發(fā)送數(shù)據(jù)必須為數(shù)組形式,所以串口發(fā)送時間首先需要將時間的時、分、秒數(shù)值分別發(fā)送到數(shù)組的三個元素當(dāng)中,然后調(diào)用串口發(fā)送方法發(fā)送即可。
4)串口接收程序。串口接收程序首先判斷事件類型,如果是一個串口接收事件,則接收一個數(shù)據(jù)數(shù)組,然后將數(shù)據(jù)數(shù)組轉(zhuǎn)換成字符串,并顯示在相應(yīng)的文本框中。
本實驗的目標為將PC 機時間與網(wǎng)絡(luò)同步,利用串口將本機時間發(fā)送至微控制器,微控制器將接收到的時間動態(tài)顯示于數(shù)碼管上。本文實驗可提供一種精確、快捷的時間設(shè)定方法,具有較強的工程實踐意義,而且實驗中使用的USART1 是微控制器下載程序通信接口,沒有增加任何硬件成本。
單擊Windows 桌面任務(wù)欄日期時間顯示區(qū)域,選擇更改日期和時間設(shè)置選項,打開日期和時間對話框,在對話框中單擊Internet 時間選項框,并進一步單擊更改設(shè)置按鈕,打開Internet 時間設(shè)置對話框,勾選“與Internet 時間服務(wù)器同步”復(fù)選框,并單擊確定。至此,PC 機系統(tǒng)時間網(wǎng)絡(luò)同步已經(jīng)完成。當(dāng)然,如果不選擇網(wǎng)絡(luò)時間同步也是可以的,只是此時個人計算機的系統(tǒng)時間設(shè)置可能不精確。
上位機開發(fā)的通信程序可以生成可執(zhí)行文件“單片機與PC 機通信.exe”,具體的文件名和工程名有關(guān),并且可以修改,生成的可執(zhí)行文件可以獨立運行。
打開開發(fā)板電源,下載串口通信程序,并復(fù)位運行。在PC 機上雙擊運行“單片機與PC 機通信.exe”程序,并單擊“發(fā)送時間”按鈕,上位機系統(tǒng)時間數(shù)值就會發(fā)送到單片機,并顯示于數(shù)碼管上,單片機同時將收到數(shù)據(jù)的個數(shù)回傳至PC 機,并顯示于軟件窗體的文本框當(dāng)中。其操作界面如圖6 所示。
圖6 串口通信測試圖
在很多串口通信軟件中都會用到串口通信控件mscomm32.ocx,本文編寫的上位機通信軟件也不例外,該控件在有些WIN7 或WIN10 系統(tǒng)中沒有注冊,運行時會提示找不到控件、錯誤,此時需要對控件進行注冊。具體步驟如下:
1)百度搜索或到微軟官網(wǎng)下載mscomm32.ocx。
2)將控件放到相應(yīng)文件夾內(nèi),32 位系統(tǒng)路徑為“C:Windows System32”;64 位 系 統(tǒng) 路 徑 為“C:WindowsSyswow64”。
3)然后在對應(yīng)目錄下找到cmd.exe 文件,單擊鼠標右鍵,以管理員身份運行(關(guān)鍵),在命令窗口輸入regsvr32 mscomm32.ocx。
經(jīng)過以上3 步即可完成控件注冊。
對于很多同學(xué)來說,可能沒有掌握一門可視化編程語言,則解決這一問題較好的方法是使用串口調(diào)試助手。需要說明的是各種版本串口調(diào)試助手略有差別,但大同小異,可以舉一反三。
具體調(diào)試步驟如下:
1)打開開發(fā)板電源,運行微控制器程序。
2)運行串口調(diào)試助手,并打開串口通信設(shè)置對話框,將其設(shè)置為“96 N 8 1”,無硬件流控制格式,默認即為該選項。
3)串口調(diào)試選項設(shè)置,設(shè)置結(jié)果如圖7 所示,其中重要選項如紅色框線所示。
圖7 串口設(shè)置及收發(fā)數(shù)據(jù)界面
4)串口收發(fā)通信,采用兩種方式進行實驗,第一種方式為時、分、秒三個數(shù)值分開發(fā)送,第二種方式為時、分、秒一起發(fā)送(用空格分隔),操作過程如圖7 所示。設(shè)要設(shè)定的時間為“10:18:30”,加上控制位,則需要發(fā)送十六進制數(shù)據(jù)“0A 52 9E”,此處要注意發(fā)送和接收數(shù)據(jù)均為十六進制,且輸入和顯示均沒有“0x”或“H”等附加格式。
串口調(diào)試助手在沒有顯示屏的單片機應(yīng)用系統(tǒng)中有著十分廣泛的應(yīng)用,可以利用函數(shù)重定向功能,調(diào)用printf()函數(shù),將開發(fā)板獲取數(shù)據(jù),通過串口輸出到PC機,為程序調(diào)試和串口通信提供極大方便。
本文設(shè)計一個綜合性PC 與微控制器串口通信教學(xué)實驗,實驗設(shè)計包括硬件設(shè)計和軟件設(shè)計兩部分。硬件設(shè)計采用CH340G 芯片實現(xiàn)USB 接口轉(zhuǎn)串口功能,有效地解決了目前PC 機普遍不具備串口的問題,并實現(xiàn)了供電、下載、通信三者功能,是一個很好的創(chuàng)新。軟件設(shè)計獨立完成微控制器程序設(shè)計和上位機軟件開發(fā)兩部分工作,提出一種串口通信應(yīng)用層協(xié)議,合并2 位控制位和6 位數(shù)據(jù)位形成單字節(jié)數(shù)據(jù)幀,突破單次發(fā)送數(shù)據(jù)順序和大小的限制,具有簡潔、高效、靈活等優(yōu)點。項目在上位機與單片機之間建立雙向串行通信鏈接,上位機獲取網(wǎng)絡(luò)時間數(shù)值,將其發(fā)送給單片機,單片機接收并提取時間數(shù)值,送入數(shù)碼管顯示,并回傳接收到的數(shù)據(jù)個數(shù)。通過該實驗的學(xué)習(xí)和應(yīng)用,學(xué)生基本可以掌握STM32 串行接口USART 的原理和使用方法。