ARM的串行口實(shí)驗(yàn)
一、 實(shí)驗(yàn)?zāi)康?br>1.掌握ARM 的串行口工作原理。
2.學(xué)習(xí)編程實(shí)現(xiàn)ARM 的UART 通訊。
3.掌握CPU 利用串口通訊的方法。
二、 實(shí)驗(yàn)內(nèi)容
學(xué)習(xí)串行通訊原理,了解串行通訊控制器,閱讀ARM 芯片文檔,掌握ARM 的UART
相關(guān)寄存器的功能,熟悉ARM 系統(tǒng)硬件的UART 相關(guān)接口。編程實(shí)現(xiàn)ARM 和計(jì)算機(jī)之間
串行通訊:
ARM 監(jiān)視串行口,將接收到的字符在液晶屏上顯示出來(lái)。(計(jì)算機(jī)向串口發(fā)送數(shù)據(jù)是通
過(guò)鍵盤(pán)來(lái)實(shí)現(xiàn)的)
三、 預(yù)備知識(shí)
1、用ARM SDT 2.5 集成開(kāi)發(fā)環(huán)境,編寫(xiě)和調(diào)試程序的基本過(guò)程。
2、ARM 應(yīng)用程序的框架結(jié)構(gòu)。
3、會(huì)使用Source Insight 3 編輯C 語(yǔ)言源程序。
4、了解串行總線
四、 實(shí)驗(yàn)設(shè)備及工具
硬件:ARM 嵌入式開(kāi)發(fā)板、用于ARM7TDMI 的JTAG 仿真器、PC 機(jī)Pentumn100 以
上、串口線
軟件:PC 機(jī)操作系統(tǒng)win98、ARM SDT 2.51 集成開(kāi)發(fā)環(huán)境、仿真器驅(qū)動(dòng)程序、Source
Insight 3.0
五、 實(shí)驗(yàn)原理及說(shuō)明
1.異步串行I/O
異步串行方式是將傳輸數(shù)據(jù)的每個(gè)字符一位接一位(例如先低位、后高位)地傳送。數(shù)據(jù)
的各不同位可以分時(shí)使用同一傳輸通道,因此串行I/O 可以減少信號(hào)連線,最少用一對(duì)線
即可進(jìn)行。接收方對(duì)于同一根線上一連串的數(shù)字信號(hào),首先要分割成位,再按位組成字符。
為了恢復(fù)發(fā)送的信息,雙方必須協(xié)調(diào)工作。在微型計(jì)算機(jī)中大量使用異步串行I/O 方式,
雙方使用各自的時(shí)鐘信號(hào),而且允許時(shí)鐘頻率有一定誤差,因此實(shí)現(xiàn)較容易。但是由于每個(gè)
字符都要獨(dú)立確定起始和結(jié)束(即每個(gè)字符都要重新同步),字符和字符間還可能有長(zhǎng)度不定
的空閑時(shí)間,因此效率較低。
圖3-1 串行通信字符格式
圖3-1l 給出異步串行通信中一個(gè)字符的傳送格式。開(kāi)始前,線路處于空閑狀態(tài),送出連
續(xù)“1”。傳送開(kāi)始時(shí)首先發(fā)一個(gè)“0”作為起始位,然后出現(xiàn)在通信線上的是字符的二進(jìn)制
編碼數(shù)據(jù)。每個(gè)字符的數(shù)據(jù)位長(zhǎng)可以約定為5 位、6 位、7 位或8 位,一般采用ASCII 編碼。
后面是奇偶校驗(yàn)位,根據(jù)約定,用奇偶校驗(yàn)位將所傳字符中為“1”的位數(shù)湊成奇數(shù)個(gè)或偶數(shù)個(gè)。也可以約定不要奇偶校驗(yàn),這樣就取消奇偶校驗(yàn)位。最后是表示停止位的“1”信號(hào),
這個(gè)停止位可以約定持續(xù)1 位、1.5 位或2 位的時(shí)間寬度。至此一個(gè)字符傳送完畢,線路又
進(jìn)入空閑,持續(xù)為“1”。經(jīng)過(guò)一段隨機(jī)的時(shí)間后,下一個(gè)字符開(kāi)始傳送才又發(fā)出起始位。
每一個(gè)數(shù)據(jù)位的寬度等于傳送波特率的倒數(shù)。微機(jī)異步串行通信中,常用的波特率為
50,95,110,150,300,600,1200,2400,4800,9600 等。
接收方按約定的格式接收數(shù)據(jù),并進(jìn)行檢查,可以查出以下三種錯(cuò)誤:
1.奇偶錯(cuò):在約定奇偶檢查的情況下,接收到的字符奇偶狀態(tài)和約定不符。
2.幀格式錯(cuò):一個(gè)字符從起始位到停止位的總位數(shù)不對(duì)。
3.溢出錯(cuò):若先接收的字符尚未被微機(jī)讀取,后面的字符又傳送過(guò)來(lái),則產(chǎn)生溢出錯(cuò)。
每一種錯(cuò)誤都會(huì)給出相應(yīng)的出錯(cuò)信息,提示用戶處理。
2.串行接口的物理層標(biāo)準(zhǔn)
通用的串行I/O 接口有許多種,現(xiàn)僅就最常見(jiàn)的兩種標(biāo)準(zhǔn)作簡(jiǎn)單介紹。
(—)EIA RS—232C
這是美國(guó)電子工業(yè)協(xié)會(huì)推薦的一種標(biāo)準(zhǔn)(Electronic industries Association Recoil-mended
Standard)。它在一種25 針接插件(DB—25)上定義了串行通信的有關(guān)信號(hào)。這個(gè)標(biāo)準(zhǔn)后來(lái)被
世界各國(guó)所接受并使用到計(jì)算機(jī)的I/O 接口中。
⑴ 信號(hào)連線
在實(shí)際異步串行通信中,并不要求用全部的RS—232C 信號(hào),許多PC/XT 兼容機(jī)僅用
15 針接插件(DB—15)來(lái)引出其異步串行I/O 信號(hào),而PC 中更是大量采用9 針接插件(DB
—9)來(lái)?yè)?dān)當(dāng)此任,因此這里也不打算就RS—232C 的全部信號(hào)作詳細(xì)解釋。圖5.6.2 給出兩
臺(tái)微機(jī)利用RS—232C 接口通信的連線(無(wú)MODEM),我們按DB—25 的引腳號(hào)標(biāo)注各個(gè)信
號(hào)。
下面對(duì)圖5.6.2 中幾個(gè)主要信號(hào)作簡(jiǎn)要說(shuō)明。
保護(hù)地 通信線兩端所接設(shè)備的金屬外殼通過(guò)此線相聯(lián)。當(dāng)通信電纜使用屏蔽線時(shí),常
利用其外皮金屬屏蔽網(wǎng)來(lái)實(shí)現(xiàn)。由于各設(shè)備往往已通過(guò)電源線接通保護(hù)地,因此,通信線中
不必重復(fù)接此地線(圖中用虛線表示)。例如使用9 針插頭(DB—9)的異步串行I/O 接口就沒(méi)
有引出保護(hù)地信號(hào)。
TXD/RXD 是一對(duì)數(shù)據(jù)線,TXD 稱發(fā)送數(shù)據(jù)輸出,RXD 稱接收數(shù)據(jù)輸入。當(dāng)兩臺(tái)微
機(jī)以全雙工方式直接通信(無(wú)MODEM 方式)時(shí),雙方的這兩根線應(yīng)交叉聯(lián)接(扭接)。
信號(hào)地 所有的信號(hào)都要通過(guò)信號(hào)地線構(gòu)成耦合回路。通信線有以上三條(TXD、RXD
和信號(hào)地)就能工作了。其余信號(hào)主要用于雙方設(shè)備通信過(guò)程中的聯(lián)絡(luò)(握手信號(hào)),而且有些
信號(hào)僅用于和MODEM 的聯(lián)絡(luò)。若采取微型機(jī)對(duì)微型機(jī)直接通信,且雙方可直接對(duì)異步串
行通信電路芯片編程,若設(shè)置成不要任何聯(lián)絡(luò)信號(hào),則其它線都可不接。有時(shí)在通信線的同
一端將相關(guān)信號(hào)短接以“自握手”方式滿足聯(lián)絡(luò)要求。這就是如圖3-2(a)所示的情況。
RTS/CTS 請(qǐng)求發(fā)送信號(hào)RTS 是發(fā)送器輸出的準(zhǔn)備好信號(hào)。接收方準(zhǔn)備好后送回清除
發(fā)送信號(hào)CTS 后,發(fā)送數(shù)據(jù)開(kāi)始進(jìn)行,在同一端將這兩個(gè)信號(hào)短接就意味著只要發(fā)送器準(zhǔn)
備好即可發(fā)送。
DCD 載波檢測(cè)(又稱接收線路信號(hào)檢測(cè))。本意是MODEM 檢測(cè)到線路中的載波信號(hào)
后,通知終端準(zhǔn)備接收數(shù)據(jù)的信號(hào),在沒(méi)有接MODEM 的情況下,也可以和RTS、CTS 短
接。
相對(duì)于MODEM 而言,微型機(jī)和終端機(jī)一樣被稱為數(shù)據(jù)終端DTE(Data Terminal
Equipment)而MODEM 被稱為數(shù)據(jù)通信裝置DCE(Data Communications Equipment),DTE 和
DCE 之間的連接不能像圖3-2 中有“扭接”現(xiàn)象,而應(yīng)該是按接插件芯號(hào),同名端對(duì)應(yīng)相
接。此處介紹的RS—232C 的信號(hào)名稱及信號(hào)流向都是對(duì)DTE 而言的。
DTR/DSR 數(shù)據(jù)終端準(zhǔn)備好時(shí)發(fā)DTR 信號(hào),在收到數(shù)據(jù)通信裝置裝備好DSR 信號(hào)后,
方可通信。圖3-2(a)中將這一對(duì)信號(hào)以“自握手”方式短接。
RI 原意是在MODEM 接收到電話交換機(jī)有效的撥號(hào)時(shí),使RI 有效,通知數(shù)據(jù)終端準(zhǔn)
備傳送。在無(wú)MODEM 時(shí)也可和DTR 相接。
圖3-2(b)給出了無(wú)MODEM 情況下,DTE 對(duì)DTE 異步串行通信線路的完整連接,它不
僅適用于微型機(jī)和微型機(jī)之間的通信,還適用于微型機(jī)和異步串行外部設(shè)備(如終端機(jī)、繪
圖儀、數(shù)字化儀等)的連接。
⑵ 信號(hào)電平規(guī)定
RS—232C 規(guī)定了雙極性的信號(hào)邏輯電平:
-3V 到-25V 之間的電平表示邏輯“1”。
+3V 到+25V 之間的電平表示邏輯“0”。
因此這是一套負(fù)邏輯定義。
以上標(biāo)準(zhǔn)稱為EIA 電平。PC/XT 系列使用的信號(hào)電平是-12V 和+12V,符合EIA 標(biāo)準(zhǔn),
但在計(jì)算機(jī)內(nèi)部流動(dòng)的信號(hào)都是TTL 電平,因此這中間需要用電平轉(zhuǎn)換電路。常用芯片
MCl488 或SN75150 將TTL 電平轉(zhuǎn)換為EIA 電平,MCl489 或SN75154 將EIA 電平轉(zhuǎn)換為
TTL 電平。PC/XT 系列以這種方式進(jìn)行串行通信時(shí),在波特率不高于9600 的情況下,理
論上通信線的長(zhǎng)度限制為15 米。
(二)20mA 電流環(huán)
20mA 電流環(huán)并沒(méi)有形成一套完整的標(biāo)準(zhǔn),主要是將數(shù)字信號(hào)的表示方法不使用電子的
高低,而改用20mA 電流的有無(wú):“1”信號(hào)在環(huán)路中產(chǎn)生20mA 電流;“0”信號(hào)無(wú)電流產(chǎn)生。
當(dāng)然也需要有電路來(lái)實(shí)現(xiàn)TTL 電平和20mA 電流之間的轉(zhuǎn)換。圖3-3 是PC/XT 微機(jī)中使用的一種20mA 電流環(huán)接口。當(dāng)發(fā)送方SOUT=1 時(shí),便有20mA 電流灌入接收方的光耦合器,
于是光耦合器導(dǎo)通,使SIN=1。反之當(dāng)發(fā)送方SOUT=0 時(shí)環(huán)路電流為零,接收方光耦合器截
止,SIN=0。顯然,當(dāng)要求雙工方式通信時(shí),雙方都應(yīng)各有收發(fā)電路,通信聯(lián)線至少要4 根。
由于通信雙方利用光耦合器實(shí)現(xiàn)電氣上隔離,而且信號(hào)又是雙端回路方式,故有很強(qiáng)的抗干
擾性,可以傳送遠(yuǎn)至1 千米的距離。
“0”、“1”信號(hào)的表示方法不同外,其他方面(如字符的傳輸格式)常借用RS—232C 標(biāo)
準(zhǔn)。因此PC/XT 微機(jī)中的異步串行道信接口往往將這兩種標(biāo)準(zhǔn)做在一起,實(shí)際通過(guò)跨接線
從二者中擇一使用。
3.ARM 自帶的串行口寄存器
ARM 自帶兩個(gè)串行口,各帶有16 字節(jié)的FIFO(先入先出寄存器),最大波特率115.2K。
每個(gè)UART 有7 種狀態(tài):溢出錯(cuò)誤,校驗(yàn)錯(cuò)誤,幀錯(cuò)誤,暫停態(tài),接收緩沖區(qū)準(zhǔn)備好,發(fā)
送緩沖區(qū)空,發(fā)送移位緩沖器空,這些狀態(tài)可以由相應(yīng)的UTRSTATn/UERSTATn 表示,并
且與發(fā)送接收緩沖區(qū)相對(duì)應(yīng)的有錯(cuò)誤緩沖區(qū)。波特率的大小可以通過(guò)控制波特率寄存器
(UBRDIVn)控制,計(jì)算公式如下:
由上表可以看出,該寄存器的第6 位決定是否使用紅外模式,位5~3 決定校驗(yàn)方式,
位2 決定停止位長(zhǎng)度,位1 和0決定每幀的數(shù)據(jù)位數(shù)。
⑵ UART 控制寄存器UCONn,該寄存器決定UART 的各種模式。UART FIFO 控制寄
存器UFCONn,UART MODEM 控制寄存器,分別決定UART FIFO 和MODEM 的模式。其
中UFCONn 的第0 位決定是否啟用FIFO,UMCONn 的第0 位是請(qǐng)求發(fā)送位,對(duì)我們來(lái)說(shuō)
是比較重要的。另外讀寫(xiě)狀態(tài)寄存器UTRSTAT 以及錯(cuò)誤狀態(tài)寄存UERSTAT,可以反映芯
片目前的讀寫(xiě)狀態(tài)以及錯(cuò)誤類型。FIFO 狀態(tài)寄存器UFSTAT 和MODEM 狀態(tài)寄存器
UMSTAT,通過(guò)前者可以讀出目前FIFO 是否滿以及其中的字節(jié)數(shù);通過(guò)后者可以讀出目前
MODEM 的CTS 狀態(tài)。
⑶ 發(fā)送寄存器UTXH 和接收寄存器URXH,這兩個(gè)寄存器存放著發(fā)送和接收的數(shù)據(jù),
當(dāng)然只有一個(gè)字節(jié)8位數(shù)據(jù)。需要注意的是在發(fā)生溢出錯(cuò)誤的時(shí)候,接收的數(shù)據(jù)必須要被讀
出來(lái),否則會(huì)引發(fā)下次溢出錯(cuò)誤。
⑷ 最后是波特率引子寄存器UBRDIV。該寄存器為十六位,算法參見(jiàn)上頁(yè)的部分。
注意:由于ARM 工作時(shí)存在小端和大端兩種工作模式,所以同樣一個(gè)寄存器在不同模
式時(shí)地址也不一樣,需要加以區(qū)別。
六、 實(shí)驗(yàn)步驟
1.不帶操作系統(tǒng)的ARM 實(shí)現(xiàn)串行功能
⑴ 學(xué)習(xí)上述串行通訊原理,了解ARM 上相應(yīng)寄存器的功能和各位的意義。
⑵ 打開(kāi)一個(gè)新工程,定義與UART 有關(guān)的各個(gè)寄存器地址和一些特殊的位命令。主
要有以下各寄存器:
/* UART 的全部功能寄存器 */
#define rULCON0 (*(volatile unsigned *)0x1d00000)
#define rULCON1 (*(volatile unsigned *)0x1d04000)
#define rUCON0 (*(volatile unsigned *)0x1d00004)
#define rUCON1 (*(volatile unsigned *)0x1d04004)
#define rUFCON0 (*(volatile unsigned *)0x1d00008)
#define rUFCON1 (*(volatile unsigned *)0x1d04008)
#define rUMCON0 (*(volatile unsigned *)0x1d0000c)
#define rUMCON1 (*(volatile unsigned *)0x1d0400c)
#define rUTRSTAT0 (*(volatile unsigned *)0x1d00010)
#define rUTRSTAT1 (*(volatile unsigned *)0x1d04010)
#define rUERSTAT0 (*(volatile unsigned *)0x1d00014)
#define rUERSTAT1 (*(volatile unsigned *)0x1d04014)
#define rUFSTAT0 (*(volatile unsigned *)0x1d00018)
#define rUFSTAT1 (*(volatile unsigned *)0x1d04018)
#define rUMSTAT0 (*(volatile unsigned *)0x1d0001c)
#define rUMSTAT1 (*(volatile unsigned *)0x1d0401c)
#define rUBRDIV0 (*(volatile unsigned *)0x1d00028)
#define rUBRDIV1 (*(volatile unsigned *)0x1d04028)
#ifdef __BIG_ENDIAN //大端模式
#define rUTXH0 (*(volatile unsigned char *)0x1d00023)
#define rUTXH1 (*(volatile unsigned char *)0x1d04023)
#define rURXH0 (*(volatile unsigned char *)0x1d00027)
#define rURXH1 (*(volatile unsigned char *)0x1d04027)
#define WrUTXH0(ch) (*(volatile unsigned char *)(0x1d00023))=(unsigned char)(ch)
#define WrUTXH1(ch) (*(volatile unsigned char *)(0x1d04023))=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)(0x1d00027))
#define RdURXH1() (*(volatile unsigned char *)(0x1d04027))
#define UTXH0 (0x1d00020+3) //byte_access address by BDMA
#define UTXH1 (0x1d04020+3)
#define URXH0 (0x1d00024+3)
#define URXH1 (0x1d04024+3)
#else //小端模式
#define rUTXH0 (*(volatile unsigned char *)0x1d00020)
#define rUTXH1 (*(volatile unsigned char *)0x1d04020)
#define rURXH0 (*(volatile unsigned char *)0x1d00024)
#define rURXH1 (*(volatile unsigned char *)0x1d04024)
#define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch)
#define WrUTXH1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)0x1d00024)
#define RdURXH1() (*(volatile unsigned char *)0x1d04024)
#define UTXH0 (0x1d00020) //byte_access address by BDMA
#define UTXH1 (0x1d04020)
#define URXH0 (0x1d00024)
#define URXH1 (0x1d04024)
#endif
將上述定義為一個(gè)AD 功能的頭文件,并且加入到工程中(44b.h)。
⑶ 在上面的文件中添加下面的執(zhí)行函數(shù),并且建立一個(gè)庫(kù)文件(*.C)包含各函
數(shù)。主要為如下幾個(gè):
void Uart_Init(int Uartnum, int mclk,int baud)//初始化函數(shù),參數(shù)為端口號(hào),時(shí)鐘,波特率
{
int i;
if(mclk==0)
mclk=MCLK;
if(Uartnum==0){ //UART0
rUFCON0=0x0; //FIFO disable
rUMCON0=0x0; //UART0
rULCON0=0x3; //Normal,No parity,1 stop,8 bit
rUCON0=0x245; //rx=edge,tx=level,disable timeout int.,enable rx
//error int.,normal,interrupt or polling
rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
}
else{
rUFCON1=0x0;
rUMCON1=0x0; //UART1
rULCON1=0x3;
rUCON1=0x245;
rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );
}
for(i=0;i<100;i++);
}
void Uart_SendString(int Uartnum, char *pt)//發(fā)送字符串函數(shù),參數(shù)為端口號(hào),發(fā)送數(shù)組
{
while(*pt){
if(*pt=='\n'){
Uart_SendByte(Uartnum, '\r');
Uart_SendByte(Uartnum, *pt++);
}
else
Uart_SendByte(Uartnum, *pt++);
}
}
void Uart_Printf(char *fmt,...) //串行口發(fā)送字符串函數(shù),僅向口0發(fā)送。
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(0, string);
va_end(ap);
}
void Uart_TxEmpty(int Uartnum) //檢查發(fā)送緩沖區(qū)是否滿函數(shù),參數(shù)為端口號(hào)
{
if(Uartnum==0)
while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
else
while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}
char Uart_Getch(char* Revdata, int Uartnum, int timeout) //串行口檢測(cè)函數(shù),將串口接收
//到的數(shù)據(jù)放入變量,參數(shù)為變量,端口號(hào),超時(shí)時(shí)間
{
int i=0;
if(Uartnum==0){
while(!(rUTRSTAT0 & 0x1)){ //Receive data read
OSTimeDly(1);
if(timeout==0)
continue;
if(++i>=timeout)
return FALSE;
}
*Revdata=RdURXH0();
return TRUE;
}
else{
while(!(rUTRSTAT1 & 0x1)){ //Receive data read
OSTimeDly(1);
if(timeout==0)
continue;
if(++i>=timeout)
return FALSE;
}
*Revdata=RdURXH1();
return TRUE;
}
}
上面的是與串行口操作有關(guān)的各種函數(shù)(44blib.c)。
⑷ 在主函數(shù)中首先初始化串行口0,然后通過(guò)串行口0 向外發(fā)送字符"U"。
/*************************串行口發(fā)送主程序**************************/
int Main(int argc, char **argv)
{
char c1;
Uart_Init(0,115200);
while(1)
{
Uart_SendByte(0xa);
Uart_SendByte(0xd);
c1=Uart_Getch();
Uart_SendByte(c1);
}
return 0;
}
2.帶操作系統(tǒng)的ARM 實(shí)現(xiàn)串行口功能
當(dāng)操作系統(tǒng)啟動(dòng)時(shí),將自動(dòng)初始化各串行口,所以應(yīng)用程序調(diào)用串行口資源將變得非常
容易。值的注意的是,應(yīng)用程序往往是多任務(wù)系統(tǒng),為了實(shí)時(shí)監(jiān)測(cè)串行口信息,在本操作環(huán)
境中必須單開(kāi)一個(gè)串行口掃描任務(wù),保證信息不丟失。
⑴ 打開(kāi)一個(gè)已有的工程文件,在其中的主函數(shù)MAIN 中添加串行口的寄存器初始化
代碼,并添加串行口和鍵盤(pán)掃描任務(wù),串行口掃描任務(wù)的代碼如下:
void Uart_Scan_Task1(void *Id)
{
char c1;
POSMSG pmsg1;
for (;;){
if(Uart_Getch(&c1,0,1))
{
pmsg1=OSCreateMessage(NULL,OSM_SERIAL,0,c1);
if(pmsg1)
SendMessage(pmsg1);
}
}
}//Uart_Scan_Task
當(dāng)系統(tǒng)收到串行口信息時(shí),將會(huì)自動(dòng)向主任務(wù)發(fā)送一個(gè)串行口消息。主任務(wù)接收到該消
息,將會(huì)調(diào)用響應(yīng)函數(shù),響應(yīng)該消息。
⑵ 添加消息響應(yīng)函數(shù)的代碼如下:
void onSerial(int portn, char c)
{
LCD_ChangeMode(DspTxtMode);
LCD_printf("%c\n",c);
Uart_SendByte(0,c);
}
⑶ 添加主任務(wù)
void Main_Task(void *Id) //Main_Test_Task
{
POSMSG pMsg=0;
ClearScreen();
//消息循環(huán)
for(;;){
pMsg=WaitMessage(0); //等待消息switch(pMsg->Message)
{
case OSM_SERIAL:
onSerial(pMsg->WParam,pMsg->LParam);
break;
}
DeleteMessage(pMsg);//刪除消息,釋放資源
}
}
通過(guò)上面兩小段代碼,系統(tǒng)就可以調(diào)用串行口資源發(fā)送信息和接收信息,相對(duì)于不
帶操作系統(tǒng)串行口任務(wù)調(diào)用,上面的程序要簡(jiǎn)單的多。從中大家也可以體會(huì)到在操作系
統(tǒng)的基礎(chǔ)上開(kāi)發(fā)應(yīng)用程序的好處。
七、 思考題
1.232 串行通訊的數(shù)據(jù)格式是什么?
2.串行通訊最少需要幾根線,分別如何連接?
3.ARM 的串行口有幾個(gè),相應(yīng)的寄存器是什么?
4.帶操作系統(tǒng)和不帶操作系統(tǒng)控制ARM 的串行口有什么區(qū)別?
5.為什么需要建立串行口掃描任務(wù)?
評(píng)論
查看更多