C#简单串口通讯

如今在做的是蓝牙扫码器和车载程序的通讯,作用是当扫码后会把条码值传递给车载程序,车载程序通过条码值去数据库里查询相对应的信息显示到页面中。原来的想法是通过车载程序直接连接蓝牙扫码器,这一步是实现了,详看《 C#连接蓝牙设备》这篇文章,最后一步想要我们可以实施获取到传过来的值,所以一直在查找关于接收蓝牙设备传值的方法,不过没有什么成效,所以换了一下思路使用了串口通讯。最终实现了效果,可以成功接收到值,这里分享一下方法,因为码中携带部分注释,所以下面不做说明。

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(@"HARDWARE\DEVICEMAP\SERIALCOMM");

                    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 = "COM4";
                //判断串口列表中是否存在目标串行端口
                if (!comList.Contains(targetCOMPort))
                {
                    MessageBox.Show("提示信息", "当前设备不存在配置的串行端口!");
                    System.Environment.Exit(0); //彻底退出应用程序   
                }

                serialPort = new SerialPort();

                //设置参数
                //通过串口工具查出来我们需要通讯的串口,全部给固定值
                serialPort.PortName = "COM4"; //通信端口
                serialPort.BaudRate = 9600; //串行波特率
                serialPort.DataBits = 8; //每个字节的标准数据位长度
                serialPort.StopBits = StopBits.One; //设置每个字节的标准停止位数
                serialPort.Parity = Parity.None; //设置奇偶校验检查协议
                serialPort.ReadTimeout = 3000; //单位毫秒
                serialPort.WriteTimeout = 3000; //单位毫秒
                //串口控件成员变量,字面意思为接收字节阀值,
                //串口对象在收到这样长度的数据之后会触发事件处理函数
                //一般都设为1
                serialPort.ReceivedBytesThreshold = 1;
                serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)

                try
                {
                    serialPort.Open(); //打开串口
                }
                catch (Exception ex)
                {
                    MessageBox.Show("提示信息", "串行端口打开失败!具体原因:" + ex.Message);
                    System.Environment.Exit(0); //彻底退出应用程序   
                }
            }
        }

我们这里设置了参数,如果不知道参数和自己想要连接的设备串口的话,可以下载个串口调试工具试一下,然后把参数设置成一样的就可以。
**查看串口的方法:**设备管理器=》端口(COM和LPT)
在这里插入图片描述
这里我就是使用了串口工具,挨个试然后找出了我蓝牙设备的串口。
在这里插入图片描述
找不到合适工具的可以去我的资源中下载。

3.串口数据处理

 /// <summary>
        /// 串口数据处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                //Comm.BytesToRead中为要读入的字节长度
                int len = serialPort.BytesToRead;
                Byte[] readBuffer = new Byte[len];
                serialPort.Read(readBuffer, 0, len); //将数据读入缓存
                //处理readBuffer中的数据,自定义处理过程
                string msg = Encoding.UTF8.GetString(readBuffer, 0, len-1); //获取出入库产品编号
                MessageBox.Show(msg);
            }
            catch (Exception ex)
            {
                MessageBox.Show("接收返回消息异常!具体原因:" + ex.Message, "提示信息");
            }
        }

这里面有两个需要注意的地方,下面看一下正确的写法和错误的写法:

string msg = Encoding.UTF8.GetString(readBuffer, 0, len-1); //获取出入库产品编号
string msg = Encoding.GetString(readBuffer, 0, len); //获取出入库产品编号

第一行就是正确的写法,首先如果不加UTF8的话,我这里是报错的,具体原因我也没研究明白,不过我加上.UTF8后就正常了,第二个需要注意的点就是len一定要-1,不然的话后面会跟个转义符。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晚风偷吻云朵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值