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