基于VC6.0的多臺(tái)MSP430單片機(jī)和PC機(jī)串口通訊實(shí)現(xiàn)方案
引言
在計(jì)算機(jī)控制系統(tǒng)中,不可避免的要采用多機(jī)系統(tǒng)進(jìn)行通信。在由一臺(tái)PC 機(jī)(上位機(jī)) 和多臺(tái)單片機(jī)(下位機(jī)) 構(gòu)成的分布式控制系統(tǒng)中,通過(guò)PC 機(jī)的串口與多臺(tái)單片機(jī)的通信是最方便的。在這樣的分布式控制系統(tǒng)中,單片機(jī)與微機(jī)之間的多路通信是整個(gè)系統(tǒng)的關(guān)鍵。
系統(tǒng)組成及通訊原理
系統(tǒng)構(gòu)成
系統(tǒng)構(gòu)成如圖1所示,由上位機(jī)(即計(jì)算機(jī))、通訊接口和下位機(jī)3部分組成。上位機(jī)選用的是工控機(jī) ,智能終端由單片MSP430F169和外圍傳感器放大電路等構(gòu)成。要想與PC 串口連接或者其它帶有串口的終端連接,必須要進(jìn)行EIA-RS-232C 與MSP430 電平和邏輯關(guān)系的轉(zhuǎn)換。本設(shè)計(jì)采用MAX3232芯片, 可完成3V~5V 電平與串口電平的雙向轉(zhuǎn)換。
MSP430F169單片機(jī)屬于德州儀器公司MSP430F14X/16X FLASH 系列。該系列是一組超低功耗的微控制器,工作電壓范圍1.8~3.6V。由于具有16位RISC結(jié)構(gòu),16 位寄存器和常 數(shù)寄存器,MSP430 達(dá)到了最大的代 碼效率。數(shù)字控制的振蕩器提供快速?gòu)乃械凸哪J教K醒到活動(dòng)模式的能 力時(shí)間少于6ms。 MSP430F169 帶有兩個(gè)16 位定 時(shí)器(帶看門狗功能)、速度極快的8 通道12 位A/D 轉(zhuǎn)換器(ADC)(帶內(nèi)部參考電壓、采樣保持和自動(dòng)掃描功能)、一個(gè)內(nèi)部比較器和兩個(gè)通用同步/異步發(fā)射接收器、48個(gè)I/O口(均可獨(dú)立控制)的微處理器結(jié)構(gòu)。硬件乘法器提高了單片機(jī)的性能并使單片機(jī)在編碼和硬件上可兼容。
通訊原理
MSP430F169單片機(jī)支持兩種不同的串行協(xié)議,通用同步協(xié)議(USART協(xié)議)和同步協(xié)議(SPI協(xié)議),用控制寄存器UCTL(表1)中的控制位SYNC來(lái)選擇所需的模式。SYNC=0:選擇異步模式UART;SYNC=1:選擇同步模式SPI,在此選擇異步模式。
控制寄存器內(nèi)的信息決定了USART的基本操作,如選擇通信協(xié)議、通信模式、字符長(zhǎng)度和校驗(yàn)位等。在此設(shè)定字符長(zhǎng)度為8位:CHAR=1,停止位1位:SP=0,奇校驗(yàn):PEV=0。 MSP430的波特率發(fā)生器有一預(yù)分頻/分頻器和一個(gè)調(diào)整器的組合,即使晶振頻率不是波特率的整數(shù)倍,這一組合也能使MSP430 正常工作而且還可以使其通訊協(xié)議工作在最大的波特率。采用這一技術(shù), 即使用手表晶振(32768Hz),波特率也可以達(dá)到4800 和9600,選擇波特率為9600,外部時(shí)鐘為ACLK。
系統(tǒng)通訊協(xié)議
在PC機(jī)和多臺(tái)單片機(jī)的通訊中,確定一個(gè)明確而合理的通訊協(xié)議是關(guān)鍵,包括對(duì)數(shù)據(jù)格式、通訊方式、傳送速度、傳送步驟、檢糾錯(cuò)方式以及控制字符定義等問(wèn)題做出統(tǒng)一規(guī)定。為了區(qū)別不同的分機(jī),必須為每個(gè)分機(jī)分配一個(gè)唯一的地址,此地址唯一區(qū)別各單片機(jī)。數(shù)據(jù)格式采用數(shù)據(jù)包的形式,一次傳輸一組數(shù)據(jù)。數(shù)據(jù)包格式如表2所示:
起始標(biāo)志位:1 個(gè)字節(jié)
分機(jī)地址: 1 個(gè)字節(jié)
命令/ 數(shù)據(jù): 1 個(gè)字節(jié)
數(shù)據(jù)長(zhǎng)度: 1 個(gè)字節(jié)
數(shù)據(jù)內(nèi)容: n 個(gè)字節(jié)
和檢驗(yàn): 2 個(gè)字節(jié)
結(jié)束標(biāo)志位: 1 個(gè)字節(jié)
數(shù)據(jù)格式中的地址位表示與PC 機(jī)通訊的單片機(jī)地址。操作命令則表示此次通訊要完成的操作。在單片機(jī)發(fā)送上位機(jī)接收的時(shí)候,協(xié)議規(guī)定命令FFH 為上報(bào)數(shù)據(jù), 此時(shí)數(shù)據(jù)包中的數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)內(nèi)容、和檢驗(yàn)三個(gè)域便填充實(shí)際發(fā)送數(shù)據(jù)的個(gè)數(shù)、數(shù)據(jù)及和校驗(yàn);命令F0H - F3H 則表示單片機(jī)給PC機(jī)的反饋信息,此時(shí)數(shù)據(jù)包中的數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)內(nèi)容和檢驗(yàn)三個(gè)域?yàn)榭?,其中?dāng)命令為F0H 表示接收成功,F(xiàn)1H 表示接收失敗并要求重發(fā),F(xiàn)2H 表示單片機(jī)有數(shù)據(jù)上報(bào)要求,F(xiàn)3H 表示單片機(jī)無(wú)數(shù)據(jù)上報(bào)要求。操作命令域在PC 機(jī)發(fā)送單片機(jī)接收的時(shí)候也相似的協(xié)議規(guī)定。
軟件設(shè)計(jì)
下位機(jī)程序設(shè)計(jì)
主要由數(shù)據(jù)發(fā)送和數(shù)據(jù)接收子程序組成。設(shè)計(jì)單片機(jī)通信程序時(shí),必須充分發(fā)揮單片機(jī)的效率。由于單片機(jī)多應(yīng)用于實(shí)時(shí)性較強(qiáng)的控制場(chǎng)合,因此, 應(yīng)將及時(shí)響應(yīng)和控制對(duì)象的動(dòng)作放在優(yōu)先考慮的位置,以盡量減少通信等輔助性操作所占用的CPU時(shí)間。基于上述考慮,在設(shè)計(jì)單片機(jī)通信程序時(shí),將通信程序分為接收中斷處理程序和發(fā)送中斷處理程序2部分。
主程序首先完成串行口的初始化、設(shè)置串口的工作方式、串口波特率,數(shù)據(jù)位、校驗(yàn)位等。
(1) 接收子程序
在接收到上位機(jī)發(fā)送的地址后, 下位機(jī)響應(yīng)中斷信號(hào)進(jìn)入接收子程序。首先讀取上位機(jī)發(fā)送的地址數(shù)據(jù), 檢查地址是否匹配,如果匹配, 準(zhǔn)備接收其余的數(shù)據(jù)幀。在接收完上位機(jī)發(fā)送的數(shù)據(jù)后,判斷下位機(jī)是否發(fā)出中斷申請(qǐng),如果有,則清除中斷申請(qǐng)信號(hào)。
(2) 發(fā)送子程序只有當(dāng)發(fā)送緩沖區(qū)內(nèi)有數(shù)據(jù)要發(fā)送并且置位發(fā)送中斷允許位時(shí)才調(diào)用。
發(fā)送的數(shù)據(jù)遵守通訊協(xié)議的數(shù)據(jù)幀格式:首先發(fā)送起始標(biāo)志, 然后發(fā)送需要傳輸?shù)臄?shù)據(jù),最后發(fā)送校驗(yàn)和以及結(jié)束標(biāo)志位。
上位機(jī)通訊
上位機(jī)程序設(shè)計(jì)采用VC ++ 6.0開(kāi)發(fā)平臺(tái)來(lái)實(shí)現(xiàn)。應(yīng)用MSComm控件,可以非常方便地創(chuàng)建串行通信應(yīng)用程序,但其程序執(zhí)行效率不夠高,并且無(wú)法應(yīng)用串行通信的一些底層功能。CSerialPort類支持線連接的串口編程操作,編寫(xiě)的程序在Windows98/2000/XP下可以很好的運(yùn)行CSerialPort類是基于多線程的,它的工作過(guò)程及在本系統(tǒng)的應(yīng)用如下
1)設(shè)置通信對(duì)象、通信端口號(hào)以及配置通信格式(如起始位個(gè)數(shù)、數(shù)據(jù)位長(zhǎng)度、校驗(yàn)方式、停止位個(gè)數(shù)等) 和其他相關(guān)屬性;
2)設(shè)定通信協(xié)議;
3)打開(kāi)通信端口,進(jìn)行數(shù)據(jù)的傳輸;
m_Port.StartMonitoring();//開(kāi)啟監(jiān)視線程;
m_Port.WriteToPort((LPCTSTR)temp);//發(fā)送數(shù)據(jù);
4)關(guān)閉通信端口,釋放系統(tǒng)資源。在完成串行通信操作后,應(yīng)該將串行通信端口的資源歸還給操作系統(tǒng);
m_Port.ClosePort();//關(guān)閉串口
上位機(jī)程序工作流程如下:首先設(shè)置好串口參數(shù),再開(kāi)啟串口監(jiān)測(cè)工作線程,串口監(jiān)測(cè)工作線程監(jiān)測(cè)到串口接收到的數(shù)據(jù)、流控制事件或其他串口事件后,就以消息方式通知主程序,激發(fā)消息處理函數(shù)來(lái)進(jìn)行數(shù)據(jù)處理,這是對(duì)接收數(shù)據(jù)而言;發(fā)送數(shù)據(jù)可以直接發(fā)送。
結(jié)束語(yǔ)
串 口通訊方式在計(jì)算機(jī)控制系統(tǒng)中有著廣泛的應(yīng)用,本文設(shè)計(jì)的通訊協(xié)議經(jīng)實(shí)踐證明穩(wěn)定可靠,保證了單片機(jī)與PC之間數(shù)據(jù)傳輸?shù)臏?zhǔn)確率,CSerialPort類簡(jiǎn)化封裝了大部分通訊用API函數(shù),同時(shí)簡(jiǎn)化了編程操作在實(shí)際中有著廣泛的應(yīng)用 。
單片機(jī)相關(guān)文章:單片機(jī)教程
單片機(jī)相關(guān)文章:單片機(jī)視頻教程
單片機(jī)相關(guān)文章:單片機(jī)工作原理
分頻器相關(guān)文章:分頻器原理 晶振相關(guān)文章:晶振原理
評(píng)論