1.COMHelper類
/// <summary>初始化串行端口</summary>
private SerialPort _serialPort;
public SerialPort serialPort
{
get { return _serialPort; }
set { _serialPort = value; }
}
/// <summary>
/// COM口通信構造函數
/// </summary>
/// <param name="PortID">通信端口</param>
/// <param name="baudRate">波特率</param>
/// <param name="parity">奇偶校驗位</param>
/// <param name="dataBits">標准數據位長度</param>
/// <param name="stopBits">每個字節的標准停止位數</param>
/// <param name="readTimeout">獲取或設置讀取操作未完成時發生超時之前的毫秒數</param>
/// <param name="writeTimeout">獲取或設置寫入操作未完成時發生超時之前的毫秒數</param>
public ComHelper(string PortID, int baudRate, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One, int readTimeout = 100, int writeTimeout = 100)
{
try
{
serialPort = new SerialPort();
serialPort.PortName = "COM" + PortID;//通信端口
serialPort.BaudRate = baudRate;//波特率
serialPort.Encoding = Encoding.ASCII;
serialPort.Parity = parity;//奇偶校驗位
serialPort.DataBits = dataBits;//標准數據位長度
serialPort.StopBits = stopBits;//每個字節的標准停止位數
serialPort.ReadTimeout = readTimeout;//獲取或設置讀取操作未完成時發生超時之前的毫秒數
serialPort.WriteTimeout = writeTimeout;//獲取或設置寫入操作未完成時發生超時之前的毫秒數
}
catch (Exception ex) { throw new Exception(ex.Message); }
}
/// <summary>
/// 打開COM口
/// </summary>
/// <returns>true 打開成功;false 打開失敗;</returns>
public bool Open()
{
try
{
if (serialPort.IsOpen == false)
{
serialPort.Open();
return true;
}
}
catch (Exception ex)
{
LogImpl.Debug(ex.ToString());
}
return false;
}
/// <summary>
/// 關閉COM口
/// </summary>
/// <returns>true 關閉成功;false 關閉失敗;</returns>
public bool Close()
{
try
{
serialPort.Close();
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 判斷端口是否打開
/// </summary>
/// <returns></returns>
public bool IsOpen()
{
try
{
return serialPort.IsOpen;
}
catch { throw; }
}
/// <summary>
/// 向COM口發送信息
/// </summary>
/// <param name="sendData">16進制的字節</param>
public void WriteData(byte[] sendData)
{
try
{
if (IsOpen())
{
Thread.Sleep(5);
serialPort.Write(sendData, 0, sendData.Length);
}
}
catch { throw; }
}
/// <summary>
/// 接收來自COM的信息
/// </summary>
/// <returns>返回收到信息的數組</returns>
public string[] ReceiveDataArray()
{
try
{
Thread.Sleep(5);
if (!serialPort.IsOpen) return null;
int DataLength = serialPort.BytesToRead;
byte[] ds = new byte[DataLength];
int bytecount = serialPort.Read(ds, 0, DataLength);
return ByteToStringArry(ds);
}
catch (Exception ex)
{
LogImpl.Debug(""+ex.ToString());
throw;
}
}
/// <summary>
/// 把字節型轉換成十六進制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string[] ByteToStringArry(byte[] bytes)
{
try
{
string[] strArry = new string[bytes.Length];
for (int i = 0; i < bytes.Length; i++)
{
strArry[i] = String.Format("{0:X2} ", bytes[i]).Trim();
}
return strArry;
}
catch { throw; }
}
/// <summary>
/// 清除緩存數據
/// </summary>
public void ClearDataInBuffer()
{
try
{
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();
}
catch { throw; }
}
/// <summary>
/// 注冊 數據接收事件,在接收到數據時 觸發
/// </summary>
/// <param name="serialPort_DataReceived"></param>
public void AddReceiveEventHanlder(SerialPortDataReceivedDelegate serialPort_DataReceived)
{
try
{
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}
catch { throw; }
}
//接收事件是否有效 true開始接收,false停止接收。默認true
public static bool ReceiveEventFlag = true;
/// <summary>
/// 接收數據觸發,將接收的數據,通過一個定義的數據接收事件,傳遞出去。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (ReceiveEventFlag == false)
{
return;
}
string strReceive = ReceiveDataString();
if (!string.IsNullOrEmpty(strReceive))
{
OnReceiveDataHanlder(new ReceiveEventArgs() { ReceiveData = strReceive });
}
}
#region 數據接收事件
public event EventHandler<ReceiveEventArgs> ReceiveDataHandler;
protected void OnReceiveDataHanlder(ReceiveEventArgs e)
{
EventHandler<ReceiveEventArgs> handler = ReceiveDataHandler;
if (handler != null) handler(this, e);
}
#endregion
個helper類,沒多少東西,一般也夠用了,主要就是,讀取,寫入。
2.頁面或其他地方使用
public ComHelper comHelp;
string PortID = System.Configuration.ConfigurationManager.AppSettings["PeopleAdr"];
int baudRate = 9600;
int dataBits = 8;
System.IO.Ports.StopBits oStopBits = System.IO.Ports.StopBits.One;
//無奇偶校驗位
System.IO.Ports.Parity oParity = System.IO.Ports.Parity.None;
int ReadTimeout = 100;
int WriteTimeout = -1;
comHelp = new ComHelper(PortID, baudRate, oParity, dataBits, oStopBits, ReadTimeout, WriteTimeout);
if (!comHelp.IsOpen()) comHelp.Open();
comHelp.AddReceiveEventHanlder(comHelp.serialPort_DataReceived);//將接收到數據,處理數據的方法注冊進去
comHelp.ReceiveDataHandler += new EventHandler<ReceiveEventArgs>(rds_ReceiveDataHandler);//將傳遞接收數據的方法注冊進去,如果接收到數據,觸發事件,自動存串口數據。
public string strComReciveData = "";//從COM口接收到的數據,如果接收到數據,通過事件觸發,會自動有值。
void rds_ReceiveDataHandler(object sender, ReceiveEventArgs e)
{
try
{
strComReciveData = e.ReceiveData;
Thread.Sleep(200);
//清空緩存
comHelp.ClearDataInBuffer();
}
catch (Exception ex)
{
LogImpl.Debug(ex.ToString());
Thread.Sleep(200);
}
}
這是寫入數據,就簡單多了。
byte[] send = new byte[] { 0x7F, 0x02, 0x8F }; comHelp.WriteData(send);