C#源码多线程多串口

  • 格式:pdf
  • 大小:58.67 KB
  • 文档页数:3

C#源码多线程多串⼝

多个串⼝,最好⽤多线程,这样⽐较⽅便 ,

也可以在⼀个线程中,⼀个⼀个读串⼝数据! 本源码是从⽹上收集的,⽤于保留⾃⼰以后使⽤,同时希望对需要的朋友提供⼀点学习的资料。

using System;

using System.IO.Ports;

using System.Threading;

using System.Text;

namespace Tangxu.Common

{

public class ReadCom

{

public ReadCom()

{

_ReadConfig = new ReadConfigure(System.Environment.CurrentDirectory + "");

}

public ReadCom(string sCom,int nBaud):this()

{

}

private byte[] _ReadBuffer;

private SerialPort ss_port = new SerialPort();

private static int nReadCount = 0;

private ReadConfigure _ReadConfig;

#region Initialize com port

public bool InitCom()//初始化建串⼝类实例

{

// return true;

try

{

ss_port.PortName = _ReadConfig.GetNodeValue("PORT");// _sComPort;

ss_port.BaudRate = int.Parse(_ReadConfig.GetNodeValue("BAUD"));//_nBaud;

ss_port.ReadBufferSize = 10240;

ss_port.DataBits = int.Parse(_ReadConfig.GetNodeValue("DATA"));//8;

switch (_ReadConfig.GetNodeValue("PARITY"))

{

case "None":

ss_port.Parity = Parity.None;

break;

case "Even":

ss_port.Parity = Parity.Even;

break;

case "Mark":

ss_port.Parity = Parity.Mark;

break;

case "Odd":

ss_port.Parity = Parity.Odd;

break;

case "Space":

ss_port.Parity = Parity.Mark;

break;

}

switch (_ReadConfig.GetNodeValue("STOP"))

{

case "1":

ss_port.StopBits = StopBits.One;

break;

case "1.5":

ss_port.StopBits = StopBits.OnePointFive;

break;

case "2":

ss_port.StopBits = StopBits.Two; break;

}

ss_port.ReadTimeout = 600;

ss_port.WriteTimeout = 700;

ss_port.Open();//打开串⼝

return true;

}

catch (Exception ex)

{

throw new Exception("打开串⼝失败!\r\n错误信息:" + ex.Message);

}

}

#endregion

#region FreeDrv

///

/// free opw

///

public void FreeDrv()

{

try

{

if (ss_port != null)

{

ss_port.Close();

}

}

catch

{ }

}

#endregion

#region Write command to OPW

///

/// 发操作命令给OPW设备

/// 并返回状态

///

///

///

public string WriteCommand(string sCommand)

{

StringBuilder sb = new StringBuilder();

bool bRead = true;

try

{

ss_port.DiscardInBuffer();

ss_port.Write(sCommand);

Thread.Sleep(1500);

while (bRead)

{

_ReadBuffer = new byte[ss_port.BytesToRead];

ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);

sb.Append(Encoding.ASCII.GetString(_ReadBuffer));

Thread.Sleep(500);

if (ss_port.BytesToRead <= 0)

{

bRead= false;

}

}

if (sb.ToString().Length== 0)

{

nReadCount++;

}

if (nReadCount == 3)

{

nReadCount = 0;

throw new Exception("设置不正确或没有联接设备!"); }

}

catch (Exception ex)

{

throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);

}

return sb.ToString(); ;

}

public string WriteCommand(byte[] bCommand)

{

StringBuilder sb = new StringBuilder();

bool bRead = true;

try

{

ss_port.DiscardInBuffer();

ss_port.Write(bCommand,0,bCommand.Length);

Thread.Sleep(1500);

while (bRead)

{

_ReadBuffer = new byte[ss_port.BytesToRead];

ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);

sb.Append(Encoding.ASCII.GetString(_ReadBuffer));

Thread.Sleep(500);

if (ss_port.BytesToRead <= 0)

{

bRead = false;

}

}

if (sb.ToString().Length == 0)

{

nReadCount++;

}

if (nReadCount == 3)

{

nReadCount = 0;

throw new Exception("设置不正确或没有联接设备!");

}

}

catch (Exception ex)

{

throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);

}

return sb.ToString();

}

#endregion

#region Get All COM Port

public string[] GetAllComPort()

{

string[] sAllPort = null;

try

{

sAllPort = SerialPort.GetPortNames();

}

catch (Exception ex)

{

throw new Exception("获取计算机COM⼝列表失败!\r\n错误信息:" + ex.Message);

}

return sAllPort;

}

#endregion

}

}