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