栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.net实现串口通信

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.net实现串口通信

.net实现串口通信
  • 1、配置串口信息
  • 2、打开串口
  • 3、发送数据
  • 4、接收数据
      • 1)无返回值
      • 2)有返回值
  • 5、关闭串口
  • 6、释放资源

我这里是项目要求,基于 .net framework4.0 框架。
功能实现主要依靠.net提供的 System.IO.Ports.SerialPort 类。
串口通信分为6个步骤:

1、配置串口信息

根据设备厂商提供的串口对接说明实例化SerialPort对象。

//设置串口属性
var ComDevice = new SerialPort
{
    PortName = "COM1",	//串口
    BaudRate = 4800,	//波特率
    Parity = Parity.None,	//校验位
    DataBits = 8,		//数据位
    StopBits = StopBits.One,		//停止位
    WriteTimeout = 1000,	//设置串口写入数据阻塞时长,阻塞到写入数据或超时(这里为1秒)
    ReadTimeout = 1000,	//设置串口读取数据阻塞时长,阻塞到读取数据或超时(这里为1秒)
};
2、打开串口
        /// 
        /// 开启端口
        /// 
        /// 
        public bool OpenPort()
        {
            try
            {
                if (!ComDevice.IsOpen)
                {
                    //开启串口
                    ComDevice.Open();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("未能成功开启串口:" + ex.Message);
                return false;
            }
            return true;
        }
3、发送数据

注意设置WriteTimeout 。如果没设置,调用ComDevice.Write之后可能会卡死。

        /// 
        /// 将编码后的消息传递给串口
        /// 
        /// 
        /// 
        public bool SendData(byte[] bytesData)
        {
            //串口已开启
            if (ComDevice.IsOpen)
            {
                try
                {
                    //将消息传递给串口
                    ComDevice.Write(bytesData, 0, bytesData.Length);
                    return true;
                }
                catch (Exception ex)
                {
                   Console.WriteLine("发送失败:" + ex.Message);
                }
            }
            else
            {
                Console.WriteLine("串口未开启"); 
            }
            return false;
        }
4、接收数据 1)无返回值

通过SerialPort对象的DataReceived委托实现。

            //接收数据
            ComDevice.DataReceived += new SerialDataReceivedEventHandler((sender, e) => 
            {
                //开辟接收缓冲区
                byte[] bytesData = new byte[ComDevice.BytesToRead];
                //从串口读取数据
                ComDevice.Read(bytesData, 0, bytesData.Length);
                //数据解码,根据设备厂商约定的方式解码
                var data = Encoding.ASCII.GetString(bytesData);
            });
2)有返回值

从串口缓冲区循环读取,直到读到有效数据,返回有效数据。
有效数据的标识根据设备厂商的约定设置。

        /// 
        /// 循环读取串口数据
        /// 
        /// 数据标识
        /// 串口
        /// 
        private string CirclularReadData(string key)
        {
            for (int i = 0; i < 50; i++)
            {
                int bytesRead = ComDevice.BytesToRead; //获取接收缓冲区中数据的字节数
                //接收缓冲区数据不为空,读取缓冲池数据
                if (bytesRead > 0)
                {
                    //开辟接收缓冲区
                    byte[] bytesData = new byte[bytesRead];
                    //从串口读取数据
                    ComDevice.Read(bytesData, 0, bytesData.Length);
                    //数据编码,根据设备厂商约定的方式编码
                    var data = Encoding.ASCII.GetString(bytesData);
                    Console.WriteLine($"【串口】缓冲区数据读取(第{i}次):" + data);
                    //如果检测到标识,退出,并返回数据
                    if (data.Contains(key))
                    {
                        return data;
                    }
                }
                //接收缓冲区数据为空,阻塞当前进程,2s
                else
                {
                    Console.WriteLine("【串口】缓冲区暂无可读数据,等待2s");
                    Thread.Sleep(2000);
                }
            }
            return null;
        }
5、关闭串口
        /// 
        /// 关闭串口
        /// 
        /// 
        /// 
        public bool ClosePort(ref string msg)
        {
            try
            {
                if (ComDevice.IsOpen)
                {
                    ComDevice.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("串口关闭错误:" + ex.Message);
                return false;
            }
            return true;
        }
6、释放资源

这点很重要,串口用完就要立即释放。

ComDevice.Dispose();
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/910747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号