在同样的这个项目里,我们用C#对上位机进行串口通讯。这部分的代码并且进行了封装,以便于以后的调用。
项目结构如图所示:
是SerialHelper目录下的SerialUnit.cs
然后就直接上代码吧:
using System;
using System.IO.Ports;
using Common;
namespace SerialHelper
{
// 串口通讯单元
public class SerialUnit
{
private static SerialUnit _single;
public static SerialUnit GetInstance()
{
if (_single == null)
{
_single = new SerialUnit();
}
return _single;
}
private ProgramParam _param;
private SerialPort _serial;
public event EventHandler<SerialDataArgs> OnReceived;
private SerialUnit()
{
_param = ProgramParam.Load();
_serial = new SerialPort();
_serial.DataReceived += new SerialDataReceivedEventHandler(ReceiveHandler);
}
// 打开串口
public bool Connect(out string error)
{
error = "";
if (!_serial.IsOpen)
{
try
{
_serial.PortName = _param.SerialName;
_serial.BaudRate = _param.BaudRate;
_serial.DataBits = _param.DataBit;
switch (_param.StopBit)
{
case "1":
_serial.StopBits = StopBits.One;
break;
case "1.5":
_serial.StopBits = StopBits.OnePointFive;
break;
case "2":
_serial.StopBits = StopBits.Two;
break;
default:
_serial.StopBits = StopBits.One;
break;
}
switch (_param.CheckBit)
{
case "None":
_serial.Parity = Parity.None;
break;
case "Odd":
_serial.Parity = Parity.Odd;
break;
case "Even":
_serial.Parity = Parity.Even;
break;
default:
_serial.Parity = Parity.None;
break;
}
//打开串口
_serial.Open();
}
catch (Exception ex)
{
error = ex.Message;
}
}
return _serial.IsOpen;
}
// 关闭串口
public void Disconn()
{
_serial.Close();
}
// 处理接收数据
private void ReceiveHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
var len = 2; // _serial.BytesToRead;
var readBuffer = new byte[len];
_serial.Read(readBuffer, 0, len);
OnReceived?.Invoke(this, new SerialDataArgs(readBuffer));
}
catch (Exception ex)
{
LogHelper.LogError(
string.Format("Serial Receive Error: {0}.", ex.Message));
return;
}
}
// 发报
public void SendData(int[] data)
{
if (_serial.IsOpen)
{
var len = data.Length;
var bData = new byte[len];
for (var i = 0; i < len; i++ )
{
bData[i] = Convert.ToByte(data[i]);
}
_serial.Write(bData, 0, len);
}
}
}
public class SerialDataArgs : EventArgs
{
public byte[] Data;
public SerialDataArgs(byte[] data)
{
Data = data;
}
}
}