c# 循环com,分别对串口写入与读取,获取需要的串口信息

本文介绍了一种通过串口获取产品设备号的方法。利用C#实现,遍历所有可用串口,设置串口参数,发送特定指令获取设备信息,并解析返回数据提取设备号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private SerialPort serialPort;//串口对象类

        private string strPortDataReceived = "";//记录串口返回值
        private string serialPortName = "";//记录端口号

        private bool isGet = false;


        /// <summary>
        /// 获取产品设备号
        /// </summary>
        /// <returns>设备号</returns>
        public List<string> GetProductNumBySerialPort()
        {
            List<string> productNumList = new List<string>();
            string[] ports = SerialPort.GetPortNames();
            if (ports.Length > 0)
            {
                for (int i = 0; i < ports.Length; i++)
                {
                    string portName = ports[i];

                    serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One);
                    //serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);//DataReceived事件委托
                    serialPort.ReceivedBytesThreshold = 1;
                    serialPort.RtsEnable = true;
                    serialPort.WriteTimeout = 500;
                    serialPort.ReadTimeout = 500;
                    try//这里写成异常处理的形式以免串口打不开程序崩溃
                    {
                        serialPort.Open();
                    }
                    catch { }
                    if (serialPort.IsOpen)
                    {
                        //byte[] ar = StringToByteHelper.HexStringToByteArray("1F1109");
                        byte[] WriteBuffer = new byte[] { 0x1F, 0x11, 0x09 };
                        try
                        {
                            serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);//获取设备编号
                        }
                        catch (Exception ex)
                        {
                            string str = ExceptionClass.GetExceptionMsg(ex, "串口读写超时"+ "\r\n");
                            ExceptionClass.WriteException(str);
                        }//Thread.Sleep(100);
                        int r = 0;
                        //读取返回数据
                        while (serialPort.BytesToRead == 0)
                        {
                            r++;
                            Thread.Sleep(1);
                            if (r >= 500)
                            {
                                break;
                            }
                        }
                        Thread.Sleep(50); //50毫秒内数据接收完毕,可根据实际情况调整
                        r = 0;
                        byte[] recData = new byte[serialPort.BytesToRead];
                        serialPort.Read(recData, 0, recData.Length);
                        string strPortDataReceived = System.Text.Encoding.Default.GetString(recData);
                        Console.WriteLine(strPortDataReceived);
                        if (strPortDataReceived.Length >= 17)
                        {
                            productNumList.Add(strPortDataReceived.Substring(2, 4));
                        }
                        serialPort.Close();//关闭该端口
                    }
                    else
                    {
                        //MessageBox.Show("串口打开失败!");
                        //return false;
                    }
                }
            }
            else
            {
                //MessageBox.Show("没有可用的串口!");    
            }
            return productNumList;
        }

 

转载于:https://www.cnblogs.com/xunyiHe/p/10538794.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值