串口通訊,是工業(yè)自動(dòng)化、智能終端、通信管理等領(lǐng)域傳統(tǒng)且重要的通訊手段。最常用到的串口通信模式往往是兩種:RS232和RS485。其中RS232通訊方式有三線制和九線制兩種。
英創(chuàng)所有型號(hào)的嵌入式主板均提供有串行通信接口(串口),根據(jù)不同的主板型號(hào),串口的數(shù)量也不同,如: ETR232i、 ETR186提供有3個(gè)串口;EM9000、EM9161提供有4個(gè)串口;EM9260、EM9360、EM9160則直接提供多達(dá)6個(gè)串口。除了系統(tǒng)板載的串口以外,客戶還可根據(jù)自己的應(yīng)用進(jìn)行靈活擴(kuò)展。基于英創(chuàng)的嵌入式系統(tǒng)的精簡(jiǎn)ISA總線或?qū)S玫臄U(kuò)展底板,可擴(kuò)展出更多的通用串口,現(xiàn)可用的擴(kuò)展配件有:ETA502、ETA503、ETA504。所有的串口的通訊的最高波特率均能達(dá)到115200bps。
英創(chuàng)工控主板直接提供的串口既有標(biāo)準(zhǔn)的RS232接口,也有TTL電平的串行接口,這意味著,TTL電平的串口只需要添加簡(jiǎn)單的外圍電路驅(qū)動(dòng),就可直接轉(zhuǎn)換為標(biāo)準(zhǔn)RS232、RS485接口以及RS422接口。某些用戶(如電力系統(tǒng)用戶)還可以根據(jù)實(shí)際情況需要,在串口上添加光電隔離電路,以達(dá)到保護(hù)端口的目的。英創(chuàng)公司給用戶提供的開發(fā)底板(隨基本開發(fā)套件提供)就充分地考慮了用戶對(duì)于串口應(yīng)用的多方面要求,既引出了RS232接口,也引出了 RS485接口,滿足了用戶靈活使用的需要。
串口擴(kuò)展模塊
英創(chuàng)公司所提供的基于系統(tǒng)提供串口的嵌入式主板,均是通過嵌入式主板上的插針的方式,作為與用戶的接口。這些串口,能夠滿足大多數(shù)的應(yīng)用環(huán)境。除止之外,還可以使用英創(chuàng)公司的串口擴(kuò)展模塊進(jìn)行擴(kuò)展。
ETA503
ETA503是基于英創(chuàng)公司的嵌入式系統(tǒng)所特有的精簡(jiǎn)ISA總線,擴(kuò)展4個(gè)串口的擴(kuò)展模塊。4個(gè)串口均是9線制通用RS232電平信號(hào)。
該模塊可以通過ISA總線在英創(chuàng)公司的所有嵌入式主板(X86系列及ARM系列)中使用,即可以通過短的排線連接在ISA總線上,這種方式可以快速實(shí)現(xiàn)功能評(píng)估,也可以將ETA503當(dāng)作一個(gè)元器件一樣,用插針插在應(yīng)用系統(tǒng)中所提供的插座上(ARM9+ETA503應(yīng)用方案示列參考:《WinCE系統(tǒng)多串口擴(kuò)展方案》)。
RS485通訊接口
在很多的工業(yè)應(yīng)用場(chǎng)合中,長(zhǎng)距離的通訊,仍是采用RS485的通訊方式,這種方式的應(yīng)用簡(jiǎn)單、通訊可靠、成本也很低。
其接法是:將通用的串行通訊口的接收(RX)與發(fā)送(TX)分別接至RS485接口芯片的接收輸出(RO)與發(fā)送輸入(TI)口,再用一個(gè)信號(hào)來控制RS485的收/發(fā)狀態(tài)。英創(chuàng)公司提供的RS485通訊電路中,對(duì)RS485的收發(fā)控制采用了自動(dòng)收/發(fā)控制電路。這樣,一是減少了對(duì)系統(tǒng)資源的占用,二是保持與RS232一樣的驅(qū)動(dòng)程序,從而提高程序的執(zhí)行效率。
自動(dòng)收/發(fā)控制原理:
在通訊空閑狀態(tài),TXD(數(shù)據(jù)發(fā)送信號(hào))為高, A點(diǎn)為高,B點(diǎn)經(jīng)R21給C11充電,其充電時(shí)間為T1,該時(shí)間定為串口發(fā)送一個(gè)字節(jié)所需的時(shí)間,由R21與C11的參數(shù)來確認(rèn)。充滿后,R/T為低,RS485處于接收數(shù)據(jù)的狀態(tài)。
在發(fā)送數(shù)據(jù)時(shí),TXD起始位產(chǎn)生第一個(gè)下降沿,使A點(diǎn)為低,B點(diǎn)經(jīng)過D5進(jìn)行快速放電,使R/T很快變?yōu)楦撸琑S485處于數(shù)據(jù)發(fā)送狀態(tài)。在發(fā)送過程中,當(dāng)TXD變成高電平時(shí),C11通過R21緩慢充電,使R/T仍然保持在發(fā)送狀態(tài),可有效吸收總線上的反射信號(hào)。當(dāng)RC充電結(jié)束,使R/T轉(zhuǎn)入接受狀態(tài)時(shí),總線上的上拉、下拉電阻將維持TXD高電平的發(fā)送狀態(tài),直至整個(gè)bit發(fā)送結(jié)束。
當(dāng)數(shù)據(jù)發(fā)送完畢以后,TXD變?yōu)楦唠娖?,RC又開始充電,即經(jīng)T1時(shí)間后,RS485又轉(zhuǎn)換為數(shù)據(jù)接收狀態(tài)。
雖然RS485接口芯片具有一定的抗浪涌能力,但是在很多的工業(yè)現(xiàn)場(chǎng),仍存在對(duì)接口芯片及系統(tǒng)有威脅的干擾。所以通常會(huì)采取一定的措施來進(jìn)行系統(tǒng)的保護(hù)。如光電隔離與TVS等。需注意的是,如加了光電隔離,必須使其電源也隔開,這樣才能起到隔離作用。
ETA232
在英創(chuàng)所提供的嵌入式主板中,即給了RS232電平信號(hào)的串行通訊接口,也給出了TTL電平信號(hào)的串行通訊接口,且TTL電平信號(hào)的串口支持MODEM控制。如用戶在使用中,要用到TTL電平信號(hào)的串口來作RS232的通訊或是控制MODEM,則需要將TTL電平信號(hào)轉(zhuǎn)換為RS232電平信號(hào)。為此,英創(chuàng)公司也提供了相應(yīng)的轉(zhuǎn)換模塊ETA323,將TTL接口的信號(hào)轉(zhuǎn)換為9線制標(biāo)準(zhǔn)的RS232接口。
基于英創(chuàng)公司的嵌入式系統(tǒng)的串口的基本應(yīng)用
對(duì)于英創(chuàng)公司所提供的串口通訊的驅(qū)動(dòng),均是以中斷服務(wù)的形式,實(shí)現(xiàn)與底層硬件間的通訊。
下面以X86系列為例,說明其最基本的應(yīng)用原理:
中斷服務(wù)程序的任務(wù),就是對(duì)串口數(shù)據(jù)的接收及用戶數(shù)據(jù)的發(fā)送進(jìn)行處理并對(duì)數(shù)據(jù)環(huán)形BUFF管理的過程。
當(dāng)有數(shù)據(jù)被接收時(shí),中斷服務(wù)程序便將所接收到的數(shù)據(jù)從硬件模塊中取出,并按一定的規(guī)則送入到指定的串口的接收BUFF中存貯。用戶使用GetInputData( )函數(shù)來讀取接收BUFF中的數(shù)據(jù)。應(yīng)注意的是,GetInputData( )函數(shù)一次只能從BUFF中讀取一個(gè)字節(jié)的數(shù)據(jù),所以,在應(yīng)用程序中,應(yīng)重復(fù)調(diào)用這個(gè)函數(shù)直到函數(shù)的返回值為-1時(shí),才表明將接收BUFF中的數(shù)據(jù)全部讀出。
當(dāng)用戶要發(fā)送數(shù)據(jù)時(shí),調(diào)用PutOutputData ( )將用戶已準(zhǔn)備好的數(shù)據(jù),依次填入數(shù)據(jù)發(fā)送BUFF中。在數(shù)據(jù)填完后,調(diào)用StartSend( )啟動(dòng)串口發(fā)送中斷,這時(shí)數(shù)據(jù)的發(fā)送將由中斷服務(wù)程序來完成。應(yīng)注意的是,PutOutputData ( )函數(shù)一次也只能將一個(gè)字節(jié)的數(shù)據(jù)填入BUFF中,要反復(fù)調(diào)用該函數(shù)直到所有的數(shù)據(jù)都被填入BUFF。如PutOutputData ( )函數(shù)返回了-1,則表明BUFF已被填滿,再往BUFF中填數(shù)據(jù),將不會(huì)被接授。
對(duì)于用戶的應(yīng)用程序,可以參考以下的說明:
1、 用戶可以用查詢或定時(shí)或其它的方式,對(duì)串口的數(shù)據(jù)讀取。如確認(rèn)接收BUFF中有數(shù)據(jù)存在,建議一次將其全部讀出。讀取串口數(shù)據(jù)的參考程序如下:
int ReadRxdBuff( int ComIdx , unsigned char *RxBuff , int MaxLen )
{
int i1,i2;
for(i2=0 ; ; )
{
// 檢查某個(gè)串口是否有數(shù)據(jù),如沒有數(shù)據(jù)則退出,否則,將數(shù)據(jù)放入緩存器以便使用
i1 = GetInputData( ComIdx );
if( i1==-1 )
break;
RxBuff[i2]=char ( i1 );
i2++;
if(i2==MaxLen)
break;
}
return i2;
}
函數(shù)的參數(shù)說明如下:
ComIdx 要讀取的串口序號(hào)
*RxBuff 讀出的數(shù)據(jù)要存放的數(shù)據(jù)緩存器
MaxLen 讀出數(shù)據(jù)的最大長(zhǎng)度,以限制一次性讀取的長(zhǎng)度
2、當(dāng)用戶有數(shù)據(jù)需要發(fā)送時(shí),首先應(yīng)將要發(fā)送的數(shù)據(jù)準(zhǔn)備好,再依次將的要發(fā)送的數(shù)據(jù)一次性全部填入對(duì)應(yīng)的發(fā)送BUFF中。再啟動(dòng)數(shù)據(jù)發(fā)送。應(yīng)注意的是,要發(fā)送的數(shù)據(jù)的長(zhǎng)度要有一定的限制,不能超出發(fā)送BUFF的長(zhǎng)度。數(shù)據(jù)發(fā)送的參考程序如下:
int SendTxdBuff( int ComIdx , unsigned char *TxBuff , int TxLen )
{
int i1,i2;
for( i2=0; i2 <>
{
i1=PutOutputData( ComIdx ,TxBuff[i2] );
// 每填入一個(gè)數(shù)據(jù),建議檢查一下BUFF是否被填滿
if( i1==-1 )
break;
}
// 數(shù)據(jù)被填入BUFF后,應(yīng)啟動(dòng)發(fā)送中斷。讓中斷程序來完成數(shù)據(jù)的發(fā)送
StartSend( ComIdx );
return i2;
}
函數(shù)的參數(shù)說明如下:
ComIdx 要發(fā)送數(shù)據(jù)的串口序號(hào)
*TxBuff 要發(fā)送的數(shù)據(jù)
TxLen 發(fā)送數(shù)據(jù)的長(zhǎng)度
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6084瀏覽量
35154
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論