C#串口操作的使用淺析
C#串口操作的使用:做工業(yè)通信有很長(zhǎng)時(shí)間了,特別是串口(232/485),有VB/VC/C各種版本的串口操作代碼,這些代碼也經(jīng)過(guò)了多年的現(xiàn)場(chǎng)考驗(yàn),應(yīng)該說(shuō)是比較健壯的代碼,但是目前卻沒(méi)有C#相對(duì)成熟的串口操作代碼,最近用Moxa的設(shè)備開(kāi)發(fā)基于WinCE5.0的C#串口操作代碼,所以就擴(kuò)充完善了一下C#串口操作,特別是SendCommand函數(shù),這是我比較常用的主從通信代碼,不喜歡用事件或線程接數(shù)據(jù),在規(guī)定的超時(shí)時(shí)間內(nèi)直接循環(huán)判斷要接收的數(shù)據(jù)。
下面是具體C#串口操作的代碼:
- public class PortData
- {
- public event PortDataReceivedEventHandle Received;
- public event SerialErrorReceivedEventHandler Error;
- public SerialPort port;
- public bool ReceiveEventFlag = false;
- //接收事件是否有效 false表示有效
- public PortData(string sPortName,
- int baudrate,Parity parity,SerialInterface.SerialMode mode)
- {
- port = new SerialPort(sPortName,
- baudrate, parity, 8, StopBits.One);
- port.RtsEnable = true;
- port.ReadTimeout = 3000;
- port.DataReceived +=
- new SerialDataReceivedEventHandler(DataReceived);
- port.ErrorReceived +=
- new SerialErrorReceivedEventHandler(ErrorEvent);
- }
- ~PortData()
- {
- Close();
- }
- public void Open()
- {
- if (!port.IsOpen)
- {
- port.Open();
- }
- }
- public void Close()
- {
- if (port.IsOpen)
- {
- port.Close();
- }
- }
- //C#串口操作之?dāng)?shù)據(jù)發(fā)送
- public void SendData(byte[] data)
- {
- if (port.IsOpen)
- {
- port.Write(data, 0, data.Length);
- }
- }
- public void SendData(byte[] data,
- int offset,int count)
- {
- if (port.IsOpen)
- {
- port.Write(data, offset, count);
- }
- }
- //C#串口操作之發(fā)送命令
- public int SendCommand(byte[] SendData,
- ref byte[] ReceiveData,int Overtime)
- {
- if(port.IsOpen)
- {
- ReceiveEventFlag = true;//關(guān)閉接收事件
- port.DiscardInBuffer(); //清空接收緩沖區(qū)
- port.Write(SendData, 0, SendData.Length);
- int num=0,ret=0;
- while (num++ < Overtime)
- {
- if (port.BytesToRead >= ReceiveData.Length) break;
- System.Threading.Thread.Sleep(1);
- }
- if (port.BytesToRead >= ReceiveData.Length)
- ret = port.Read(ReceiveData, 0, ReceiveData.Length);
- ReceiveEventFlag = false; //打開(kāi)事件
- return ret;
- }
- return -1;
- }
- public void ErrorEvent(object sender,
- SerialErrorReceivedEventArgs e)
- {
- if (Error != null) Error(sender, e);
- }
- //C#串口操作之?dāng)?shù)據(jù)接收
- public void DataReceived(object sender,
- SerialDataReceivedEventArgs e)
- {
- //禁止接收事件時(shí)直接退出
- if (ReceiveEventFlag) return;
- byte[] data = new byte[port.BytesToRead];
- port.Read(data, 0, data.Length);
- if (Received != null) Received(sender,
- new PortDataReciveEventArgs(data));
- }
- public bool IsOpen()
- {
- return port.IsOpen;
- }
- }
- public delegate void PortDataReceivedEventHandle(
- object sender, PortDataReciveEventArgs e);
- public class PortDataReciveEventArgs : EventArgs
- {
- public PortDataReciveEventArgs()
- {
- this.data = null;
- }
- public PortDataReciveEventArgs(byte[] data)
- {
- this.data = data;
- }
- private byte[] data;
- public byte[] Data
- {
- get { return data; }
- set { data = value; }
- }
- }
注:1~9 串口的名稱是 "COMx:",>9的以前用\\\\.\\COMx:比較好使,但是在moxa 661設(shè)備上卻不行,要用如下格式"$device\\COM" + PortNo.ToString() + "\0",也許這是moxa修改了相應(yīng)的串口驅(qū)動(dòng)。
C#串口操作的一些內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)使用C#串口操作有所幫助。
【編輯推薦】