• VS编程,C#串口通讯,通过串口读取数据的一种方法


    一、可能需要的软件:
    1、虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯。

    2、友善串口调试助手,用来发送、读取数据。

    二、思路
    1、查询本机所有的串口

    2、判断需要的串口是否存在本机的串口中

    3、设置串口的参数,如波特率、奇偶校验等。

    4、打开串口,

    5、通过串口读取数据,处理数据

    6、关闭当前窗口时,将串口一并关闭。

    7、可以写一个定时器,来循环执行1、2两步,并判断串口是否打开,以保持串口通讯正常。

    三,代码

    1、查询本机所有的串口

     /// <summary>
            /// 获取本机串口列表
            /// </summary>
            /// <param name="isUseReg"></param>
            /// <returns></returns>
            private List<string> GetComlist(bool isUseReg)
            {
                List<string> list = new List<string>();
                try
                {
                    if (isUseReg)
                    {
                        RegistryKey RootKey = Registry.LocalMachine;
                        RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWAREDEVICEMAPSERIALCOMM");
     
                        String[] ComNames = Comkey.GetValueNames();
     
                        foreach (String ComNamekey in ComNames)
                        {
                            string TemS = Comkey.GetValue(ComNamekey).ToString();
                            list.Add(TemS);
                        }
                    }
                    else
                    {
                        foreach (string com in SerialPort.GetPortNames())  //自动获取串行口名称  
                            list.Add(com);
                    }
                }
                catch
                {
                    MessageBox.Show("串行端口检查异常!", "提示信息");
                    // System.Environment.Exit(0); //彻底退出应用程序   
                }
                return list;
            }

    2、判断需要的串口是否存在本机的串口中

    /// <summary>
            /// 判断是否存在当前串口
            /// </summary>
            private void StartSerialPortMonitor()
            {
                List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表     
                if (comList.Count == 0)
                {
                    MessageBox.Show("当前设备不存在串行端口!", "提示信息");
                    // System.Environment.Exit(0); //彻底退出应用程序   
                }
                else
                {
                    string targetCOMPort = "COM8";
                    //判断串口列表中是否存在目标串行端口
                    if (!comList.Contains(targetCOMPort))
                    {
                        MessageBox.Show("提示信息", "当前设备不存在配置的串行端口!");
                        //System.Environment.Exit(0); //彻底退出应用程序   
                    }
                }
            }

    3、设置串口的参数,如波特率、奇偶校验等。

    首先定义字段:

    private SerialPort serialPort;

    /// <summary>
            /// 设置通讯串口
            /// </summary>
            public void setcom()
            {
                try
                {
                    StartSerialPortMonitor();
                    serialPort.PortName = "COM8"; //通信端口
                    serialPort.BaudRate = 9600; //串行波特率
                    serialPort.DataBits = 8; //每个字节的标准数据位长度
                    serialPort.StopBits = StopBits.Two; //设置每个字节的标准停止位数
                    serialPort.Parity = Parity.None; //设置奇偶校验检查协议
                    //下面这句是当信息中有汉字时,能正确传输,不然会出现问号。
                    serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");
                    //串口控件成员变量,字面意思为接收字节阀值,
                    //串口对象在收到这样长度的数据之后会触发事件处理函数
                    //一般都设为1
                    serialPort.ReceivedBytesThreshold = 1;
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)
     
                    serialPort.Open(); //打开串口
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
     
            }

    4、打开串口,

    5、通过串口读取数据,处理数据

    /// <summary>
            /// 通讯有数据进执行
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
            {
                getcom();
            }
    public void getcom()
            {
                try
                {
                    //定义一个字段,来保存串口传来的信息。
                    string str = "";
     
                    int len = serialPort.BytesToRead;
                    Byte[] readBuffer = new Byte[len];
                    serialPort.Read(readBuffer, 0, len);
                    str = Encoding.Default.GetString(readBuffer);
                          
     
                    //如果需要和界面上的控件交互显示数据,使用下面的方法。其中ttt是控件的名称。
                     //this.tttt.Dispatcher.Invoke(new Action(() =>
                    //{
                    //    tttt.Text = str ;
                    //}));
     
     
                    serialPort.DiscardInBuffer();  //清空接收缓冲区     
                    }
                      catch (Exception ex)
                {
                    serialPort.Close();
                    MessageBox.Show(ex.Message);
                }
           }

    6、关闭当前窗口时,将串口一并关闭

    private void MainWindow1_Closed(object sender, EventArgs e)
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                }
            }

    7、可以写一个定时器,来循环执行1、2两步,保持串口通讯正常。

    如果电脑不存在串口,提示警告
    
    如果目标串口不在电脑的串口列表里,提示警告,
    
    如果目标串口当前是关闭的状态,将其打开。
    
    如果串口已经打开,再次打开会报错,无法正常工作。一定要注意。
    if (!serialPort.IsOpen)
                {
                    serialPort.Open();
                }
  • 相关阅读:
    Java Static Import的用法
    Java EE官方文档汇总
    JDK/Java SE官方文档汇总
    IntelliJ IDEA删除所有断点
    Java基础教程:tutorialspoint-junit
    Spring MVC中@RequestParam/@RequestBody/@RequestHeader的用法收集(转)
    SpringBoot中@EnableAutoConfiguration注解用法收集
    Spring Cloud ZooKeeper集成Feign的坑3,程序Run模式运行没事,Debug模式下报错
    Java中HashMap的初始容量设置
    win7下scheme环境配置
  • 原文地址:https://www.cnblogs.com/sdxlz666/p/10577169.html
Copyright © 2020-2023  润新知