C#的串口通讯

在同样的这个项目里,我们用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;
		}
	}
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值