英創(chuàng)ARM9工控主板均提供了多個(gè)串口供客戶進(jìn)行通訊控制使用,包括標(biāo)準(zhǔn)的RS232和TTL電平的COM接口(經(jīng)過簡(jiǎn)單的電平轉(zhuǎn)換即可成為標(biāo)準(zhǔn)的RS232/RS485或者RS422)。由于英創(chuàng)ARM9嵌入式主板采用WinCE操作系統(tǒng),很多客戶都選擇了界面友好、開發(fā)便利的C#語(yǔ)言(使用Visual Studio 2005.NET集成開發(fā)環(huán)境);在VS2005中,微軟提供了一個(gè)標(biāo)準(zhǔn)的串口類SerialPort供客戶使用,該串口類可以靈活方便地進(jìn)行串口設(shè)置、收發(fā)等操作,英創(chuàng)也提供了基于該串口類的C#例程供客戶參考。但是,微軟所提供的串口類雖然方便靈活,但是沒有提供RTS控制的功能,而客戶在進(jìn)行工業(yè)現(xiàn)場(chǎng)通訊的時(shí)候,往往是需要對(duì)RTS進(jìn)行設(shè)置的。為了解決這個(gè)問題,英創(chuàng)公司現(xiàn)在提供了操作串口的COM組件接口;用戶只需要在目標(biāo)平臺(tái)上進(jìn)行組件注冊(cè),然后在C#程序開發(fā)的時(shí)候,對(duì)該COM組件添加引用,即可在程序里面自由地通過對(duì)象操作來使用函數(shù)。
注:英創(chuàng)提供的可以供C#開發(fā)使用的串口COM組件與eVC開發(fā)使用的串口COM組件在成員數(shù)據(jù)類型上有顯著區(qū)別,不能互換使用。
下面我們就以EM9000嵌入式主板為實(shí)例,在C#使用COM組件接口進(jìn)行串口操作作一個(gè)說明:
1、在目標(biāo)嵌入式主板上進(jìn)行COM組件注冊(cè)
串口COM組件的核心文件就是英創(chuàng)提供的ComSerial.dll動(dòng)態(tài)鏈接庫(kù)文件,首先需要將它在目標(biāo)嵌入式工控主板上注冊(cè)。用戶可以使用Visual Studio Remote Tools提供的“遠(yuǎn)程文件查看器”連接目標(biāo)嵌入式工控主板,并將英創(chuàng)提供的ComSerial.dll和REGSVR32.exe這兩個(gè)文件下載到目標(biāo)主板的Flash存儲(chǔ)器上去(這里假設(shè)下載到EM9000的Nor Flash)。然后在開發(fā)主機(jī)PC上使用Telnet連接目標(biāo)工控主板(如圖),進(jìn)入放置剛才下載這兩個(gè)文件的Flash存儲(chǔ)器目錄,運(yùn)行:
REGSVR32 ComSerial.dll
即可完成COM組件注冊(cè)。
2、在C#工程中添加COM組件引用
接下來可以進(jìn)入C# COM組件開發(fā)。首先將ComSerial.dll文件復(fù)制到用戶的C#工程目錄下,然后在Visual Studio 2005.NET集成開發(fā)環(huán)境中打開用戶工程。為了使用ISA總線COM組件,必須為該工程添加外部引用;用戶可在集成開發(fā)環(huán)境的右側(cè)的“解決方案資源管理器”中找到“引用”,對(duì)其單擊鼠標(biāo)右鍵,然后單擊“添加引用”(如圖)。
在彈出的“添加引用”對(duì)話框中,選擇“瀏覽”選項(xiàng)卡,并在你的工程目錄下找到你剛才復(fù)制過來的ComSerial.dll文件,選擇它,并單擊“確定”。
這時(shí),你已經(jīng)完成了添加工程中的COM組件的引用工作,這時(shí),你可以在集成開發(fā)環(huán)境的右側(cè)的“解決方案資源管理器”中看到了一個(gè)名稱為COMSERIALLib的引用,同時(shí),ComSerial.dll也加入到了你的工程中(如圖)。
3、在應(yīng)用程序開發(fā)中使用串口COM組件
首先,為了使應(yīng)用程序能直接調(diào)用相關(guān)的類和函數(shù),必須在程序的起始using語(yǔ)句中添加:
using COMSERIALLib;
程序中對(duì)于串口的操作完全圍繞CoSerialClass這個(gè)類來進(jìn)行的。用戶需要首先定義這個(gè)類的對(duì)象實(shí)體,然后通過對(duì)對(duì)象里面的方法(函數(shù))來進(jìn)行所需要的操作。下面大致做一些講解:
(1)定義類的對(duì)象
CoSerialClass COM_myserialPort = new CoSerialClass(); // 定義一個(gè)CoSerialClass串口類對(duì)象COM_myserialPort
(2)使用對(duì)象的方法函數(shù)
該串口類的對(duì)象實(shí)體主要包括四個(gè)函數(shù)和兩個(gè)事件,下面我們著重就OpenPort、ClosePort、WritePort、ReadPort四個(gè)函數(shù)和OnRecieve事件進(jìn)行舉例說明(舉例中所使用的類對(duì)象已經(jīng)在上文中定義):
int OpenPort(uint portNo, uint baud, sbyte parity, uint dataBits, uint stopBits, uint rtsCtr);
打開串口函數(shù),使用示例如下:
uint portNO = 1; // 串口1
uint myrate = 9600; // 波特率9600
COM_myserialPort.OpenPort(portNO, myrate, Convert.ToSByte(‘n’), 8, 1, RTS_CONTROL_TOGGLE);
// 參數(shù)依序:串口號(hào)、波特率、校驗(yàn)位(無)、數(shù)據(jù)位(8)、停止位(1)、RTS
注意RTS常數(shù)應(yīng)該在程序開始就定義,我們一般做如下定義:
const uint RTS_CONTROL_DISABLE = 0x00;
const uint RTS_CONTROL_ENABLE = 0x01;
const uint RTS_CONTROL_HANDSHAKE = 0x02;
const uint RTS_CONTROL_TOGGLE = 0x03;
OnRecieve事件
我們可以利用COM組件提供的OnRecieve事件(當(dāng)串口有數(shù)據(jù)收到的時(shí)候發(fā)生)來啟動(dòng)一個(gè)事件函數(shù)來讀取串口數(shù)據(jù)。OnRecieve事件可以放在程序定義串口對(duì)象實(shí)例之后程序剛開始的某個(gè)地方:
COM_myserialPort.OnReceive + = new _ICoserialEvents_OnReceiveEventHandler (COM_myserialPort_OnReceive);
// 當(dāng)串口有數(shù)據(jù)收到時(shí),啟動(dòng)COM_myserialPort_OnReceive事件函數(shù)
byte ReadPort()
讀取串口數(shù)據(jù)函數(shù),往往在OnReceive事件函數(shù)里使用,注意該函數(shù)是一次讀取一個(gè)byte,所以一次需要將數(shù)據(jù)讀取完畢(結(jié)束標(biāo)志為0xff)。使用示例如下:
private void COM_myserialPort_OnReceive() // 串口有數(shù)據(jù)收到
{
byte recieved_byte = 0;
byte[] RCV_bytes = new byte[1024];
int i=0;
for (i=0;i《1024;i++ )
{
recieved_byte = COM_myserialPort.ReadPort();
if (recieved_byte == 0xff) break;
RCV_bytes[i] = recieved_byte;
}
// 此處可對(duì)收到的數(shù)據(jù)進(jìn)行進(jìn)一步處理
}
int WritePort(int elems, byte[] buf);
發(fā)送串口數(shù)據(jù)函數(shù),使用示例如下:
byte[] sendbytemessage = Encoding.Default.GetBytes(textBox1.Text); // 將某文本框數(shù)據(jù)轉(zhuǎn)為byte數(shù)組
COM_myserialPort.WritePort(sendbytemessage.Length, sendbytemessage); // 發(fā)送
void ClosePort();
關(guān)閉串口函數(shù),直接使用即可關(guān)閉串口。
用戶還可以參考英創(chuàng)提供的C#串口COM組件例程,進(jìn)行實(shí)際的應(yīng)用開發(fā)。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6084瀏覽量
35154
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論