C#串口通讯02

C#串口通讯

串口通讯和之前网络通讯一样,首先确定需要使用到的参数,然后声名成一个对象

public class BDSerialPortParam
    {
        /// <summary>
        /// 串口号
        /// </summary>
        public string portName { get; set; }
        /// <summary>
        /// 波特率
        /// </summary>
        public int baudRate { get; set; }
        /// <summary>
        /// 数据位
        /// </summary>
        public int dataBits { get; set; }
        /// <summary>
        /// 校验位
        /// </summary>
        public Parity parity { get; set; }
        /// <summary>
        /// 停止位
        /// </summary>
        public StopBits stopBits { get; set; }
    }

接着声名串口类,进行连接

此串口使用的是modbus通讯 buffer[]数组是需要发送的指令,其中0X01是设备站号,0X03是功能码,0X44和0X0C是CRC校验码,可通过文档给的方法计算出来,具体可以查看相应的说明书会有详细的说明。

public class BD4320SerialPort
    {

        public static SerialPort Serial;
        /// <summary>
        /// 用于存储5个通道得温度
        /// </summary>
        double[] TemperatureList = new double[5];
        /// <summary>
        /// 发送给bd的字节数组
        /// </summary>
        byte[] buffer = new byte[8];
        /// <summary>
        /// 判断BD4320E是否连接
        /// </summary>
        public bool IsConnection = true;
        /// <summary>
        /// 初始化串口
        /// </summary>
        /// <returns>执行结果</returns>
        private bool InitialSerialPort( BDSerialPortParam mySerial)
        {
            if (Serial == null)
            {
                Serial = new SerialPort();
                Serial.PortName = mySerial.portName;
                Serial.BaudRate = mySerial.baudRate;
                Serial.DataBits = mySerial.dataBits;
                Serial.Parity = mySerial.parity;
                Serial.StopBits = mySerial.stopBits;

                buffer[0] = 0X01;
                buffer[1] = 0X03;
                buffer[2] = 0X00;
                buffer[3] = 0X00;
                buffer[4] = 0X00;
                buffer[5] = 0X08;
                buffer[6] = 0X44;
                buffer[7] = 0X0C;
            }
            else
            {
                Serial.Open();
                return true;
            }
            try
            {
                Serial.ReadTimeout = 1000;
                Serial.WriteTimeout = 500;
                Serial.Open();
                Serial.DtrEnable = true;
                Serial.RtsEnable = false;
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        /// <summary>
        /// 写入并读取
        /// </summary>
        public double[] WriteAndRead(ref string msg)
        {
            try
            {
                msg = "";
                for (int i = 0; i < TemperatureList.Length; i++)
                {
                    TemperatureList[i] = 999.9;
                }
                Serial.Write(buffer, 0, buffer.Length);
                Thread.Sleep(60);
                int n = Serial.BytesToRead;
                byte[] receivebBuffer = new byte[n];
                Serial.Read(receivebBuffer, 0, n);
                //返回前3个字节是头报文  ((receivebBuffer[i] << 8) | receivebBuffer[i + 1])
                /*
                 * 比如03E8H(100.0℃);
                 * 03=00000000 00000011   左移八位00000011 00000000
                 * E8=00000000 11101000   |
                 * 得到0000001111101000=1000   /10.0则得到我们实际想要的值
                 */
                for (int i = 3, j = 0; i + 2 < receivebBuffer.Length && j < 5; i = i + 2, j++)
                {
                    TemperatureList[j] = ((receivebBuffer[i] << 8) | receivebBuffer[i + 1]) / 10.0;
                }
                IsConnection = true;
                return TemperatureList;
            }
            catch (Exception ex)
                {
                    IsConnection = false;
                    msg = ex.Message;
                    return TemperatureList;
                }
        }
        /// <summary>
        /// 关闭串口资源
        /// </summary>
        /// <param name="strMessage">消息</param>
        /// <returns></returns>
        public bool ClosePort(ref string strMessage)
        {
            try
            {
                if (Serial == null)
                {
                    strMessage = "串口未实例化!";
                    return true;
                }
                if (Serial.IsOpen)
                {
                    Serial.Close();
                    if (Serial.IsOpen == false)
                    {
                        strMessage = "串口成功关闭!";
                        return true;
                    }
                    else
                    {
                        strMessage = "串口关闭失败!";
                        return false;
                    }
                }
                else
                {
                    strMessage = "串口未打开!";
                    return true;
                }
            }
            catch (Exception ex)
            {
                strMessage = ex.Message;
                Serial.Dispose();
                return false;
            }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="mySerial"></param>
        public BD4320SerialPort(BDSerialPortParam mySerial)
        {
            InitialSerialPort(mySerial);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abril_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值