C# 串口通讯

在开发C#上位机程序中经常需要使用串口对下位机设备进行数据收发操作。以下代码为个人常用的两种串口通讯收发方式。

具体的串口通讯原理不赘述,SerialPort类具体使用也不介绍,有需要可以直接复制整个串口通讯类代码,在前台代码中调用即可。
两个方式在打开串口、关闭串口、发送数据都一样,只在接收数据部分有区别。

1.发送完数据立即读取缓冲区数据,并返回接受数据。

此方法使用数据传输安全性高的场景,当发送接收失败、通讯超时等问题会提示异常。

DataSendAndRead方法是同步方法,当数据接收和发送是按顺序完成的。

在DataSendAndRead方法中,接收的字节数组可根据实际情况解析成相应数据格式,当前格式已解析为十六进制。

internal class SerialPortComm
{
    private SerialPort serialPort = new SerialPort();
    private AutoResetEvent _receiveEvent = new AutoResetEvent(false);  //用于同步主线程和事件处理程序
    private byte[] _receivedData = null;  //存储接收到的数据
    private object _syncRoot = new object();  //用于线程同步的锁对象
    public SerialPortComm()
    {
        serialPort.DataReceived += SerialPort_DataReceived;  //订阅serialPort对象的DataReceived事件
    }

    #region 打开串口
    /// <summary>
    /// 打开串口
    /// </summary>
    /// <param name="PortName">串口号</param>
    /// <param name="Baud">波特率</param>
    /// <param name="Data">数据位</param>
    /// <param name="Parity">校验位</param>
    /// <param name="Stop">停止位</param>
    /// <returns>正确返回true,错误返回false和相应错误提示。</returns>
    public ReMsg OpenPort(string PortName, string Baud, string Data, string Parity, string Stop)
    {
        #region 检测通讯设置是否正确
        if (PortName == "")
        {
            return new ReMsg(false, "未检测到串口号数据!");
        }
        if (Baud == "")
        {
            return new ReMsg(false, "未检测到波特率数据!");
        }
        if (Data == "")
        {
            return new ReMsg(false, "未检测到数据位长度数据!");
        }
        if (Parity == "")
        {
            return new ReMsg(false, "未检测到校验位数据!");
        }
        if (Stop == "")
        {
            return new ReMsg(false, "未检测到停止位数据!");
        }
        #endregion

        #region 检测串口号是否存在
        string[] ArryPort = SerialPort.GetPortNames();
        int id = Array.IndexOf(ArryPort, PortName);
        if (id == -1)
        {
            return new ReMsg(false, "当前计算机未检测到指定串口" + PortName + "!");
        }
        #endregion

        #region 检测串口是否已打开
        if (serialPort.IsOpen)
        {
            serialPort.Close();
        }
        #endregion 

        try
        {
            serialPort.PortName = PortName;
            serialPort.BaudRate = Convert.ToInt32(Baud);
            serialPort.DataBits = Convert.ToInt32(Data);
            switch (Parity)
            {
                case "N":
                    serialPort.Parity = System.IO.Ports.Parity.None;
                    break;
                case "O":
                    serialPort.Parity = System.IO.Ports.Parity.Odd;
                    break;
                case "E":
                    serialPort.Parity = System.IO.Ports.Parity.Even;
                    break;
                case "M":
                    serialPort.Parity = System.IO.Ports.Parity.Mark;
                    break;
                case "S":
                    serialPort.Parity = System.IO.Ports.Parity.Space;
                    break;
            }
            switch (Stop)
            {
                case "0":
                    ser
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值