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