C#实现监听串口数据的方法详解

 更新时间:2024年03月19日 16:37:16   作者:velo  
这篇文章主要为大家详细介绍了C#实现监听串口数据的相关方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下

在C#中,接收COM端口(串口)报文通常涉及到使用System.IO.Ports.SerialPort类,并对接收到的字节数据进行处理和格式转换。下面是一个基本的流程,描述了如何在C#中接收和转换COM端口报文:

步骤 1: 引用命名空间

首先,确保你的项目引用了处理串口通信所需的命名空间:

using System.IO.Ports;

步骤 2: 设置 SerialPort 对象

创建SerialPort对象并设置串口的配置参数(如波特率、数据位、停止位等):

SerialPort mySerialPort = new SerialPort("COM1");

mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;

// 设置读写时间超时
mySerialPort.ReadTimeout = 500;
mySerialPort.WriteTimeout = 500;

步骤 3: 打开串口

mySerialPort.Open();

步骤 4: 接收数据

你可以使用DataReceived事件来处理接收到的数据。当串口接收到数据时,这个事件会被触发:

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

实现事件处理函数DataReceivedHandler来读取数据并进行处理:

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    sp.Read(buffer, 0, buffer.Length);

    // TODO: 这里添加你的数据处理和格式转换逻辑
    string formattedData = ConvertToDesiredFormat(buffer);

    // 处理转换后的数据
    ProcessData(formattedData);
}

步骤 5: 转换格式

创建函数ConvertToDesiredFormat来实现将接收到的字节数据转换为你需要的格式。这里的实现取决于你的具体需求:

private static string ConvertToDesiredFormat(byte[] data)
{
    // 举例:将字节数据转换为ASCII字符串
    return Encoding.ASCII.GetString(data);
    // 注意:如果数据是特定协议格式,你需要根据协议解析并转换数据
}

步骤 6: 关闭串口

当数据处理完成后,记得关闭串口以释放资源:

mySerialPort.Close();

注意事项

  • 确保你有适当的权限来访问COM端口。
  • 上面的代码片段是一个简化的例子。实际应用中,你可能需要根据具体的通信协议来处理和验证数据(如计算校验和、处理数据帧等)。
  • 如果通信过程中可能出现读写冲突或其他线程安全问题,考虑使用锁(如lock语句)来同步访问串口资源。

配置完成后,程序就可以监听指定的COM端口,并在接收到数据时进行处理和转换了。记得在实际部署前,充分测试你的代码以确保它能够可靠地处理实际的通信场景。

知识补充

除了上文的内容,小编还为大家整理了C#实现串口数据侦听的相关方法,希望对大家有所帮助

当需要编程操纵硬件时会遇到过这样的问题,就是通过串口来接收硬件发来的数据,或是通过串口向硬件发送某种格式的命令。在C#平台上,可以通过 System.IO.Ports 命名空间下的SerialPort 类来实现。

下面是一个简单的示例,首先获取本机关联的串行端口列表,然后获取配置文件中配置的COM端口,检查是否在本机串行端口列表中,若在列表中则进一步实例化串口对象,并为串口对象指定数据接收事件来实现监听,示例代码如下:

using System.IO.Ports;
namespace SerialTest
{
  public class SerialTest
  {
       #region 串口监听
    
        private SerialPort serialPort = null;
        /// <summary>
        /// 开启串口监听
        /// </summary>
        private void StartSerialPortMonitor()
        {
            List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表            
       if (comList.Count == 0)
            {
                DialogForm.Show("提示信息", "当前设备不存在串行端口!");
                System.Environment.Exit(0); //彻底退出应用程序   
            }
            else
            {
                string targetCOMPort = ConfigurationManager.AppSettings["COMPort"].ToString();
                //判断串口列表中是否存在目标串行端口
                if (!comList.Contains(targetCOMPort))
                {
                    DialogForm.Show("提示信息", "当前设备不存在配置的串行端口!");
                    System.Environment.Exit(0); //彻底退出应用程序   
                }

                serialPort = new SerialPort();

                //设置参数
                serialPort.PortName = ConfigurationManager.AppSettings["COMPort"].ToString(); //通信端口
                serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings["BaudRate"].ToString()); //串行波特率
                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)
                {
                    DialogForm.Show("提示信息", "串行端口打开失败!具体原因:" + ex.Message);
                    System.Environment.Exit(0); //彻底退出应用程序   
                }
            }
        }

        /// <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.GetString(readBuffer, 0, len); //获取出入库产品编号
                DialogForm.Show("接收到的信息", msg);
            }
            catch(Exception ex)
            {
                DialogForm.Show("提示信息", "接收返回消息异常!具体原因:" + ex.Message);
            }
        }

        /// <summary>
        /// 关闭串口
        /// </summary>
        private void Stop()
        {
            serialPort.Close();
        }

        /// <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
            {
                DialogForm.Show("提示信息", "串行端口检查异常!");
                System.Environment.Exit(0); //彻底退出应用程序   
            }
            return list;
        }  

        #endregion 串口监听
  }
}

到此这篇关于C#实现监听串口数据的方法详解的文章就介绍到这了,更多相关C#监听串口数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#客户端程序Visual Studio远程调试的方法详解

    C#客户端程序Visual Studio远程调试的方法详解

    这篇文章主要给大家介绍了关于C#客户端程序Visual Studio远程调试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • c#数据绑定之数据转化为信息的示例

    c#数据绑定之数据转化为信息的示例

    这篇文章主要介绍了c#数据绑定中的数据转化为信息的示例,需要的朋友可以参考下
    2014-04-04
  • Unity3D实现分页系统

    Unity3D实现分页系统

    这篇文章主要为大家详细介绍了Unity3D实现分页系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • c#实现无标题栏窗口的拖动

    c#实现无标题栏窗口的拖动

    本篇文章是对c#中实现无标题栏窗口拖动的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 详解C# 泛型中的数据类型判定与转换

    详解C# 泛型中的数据类型判定与转换

    这篇文章主要介绍了C# 泛型中的数据类型判定与转换,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • c#和avascript加解密之间的互转代码分享

    c#和avascript加解密之间的互转代码分享

    这篇文章主要介绍了c#和Javascript间互转的Xxtea加解密代码,需要的朋友可以参考下
    2014-02-02
  • C#爬取动态网页上信息得流程步骤

    C#爬取动态网页上信息得流程步骤

    动态内容网站使用 JavaScript 脚本动态检索和渲染数据,爬取信息时需要模拟浏览器行为,否则获取到的源码基本是空的,这篇文章主要给大家详细介绍了C#爬取动态网页上信息得流程步骤,需要的朋友可以参考下
    2024-10-10
  • extern外部方法使用C#的实现方法

    extern外部方法使用C#的实现方法

    这篇文章主要介绍了extern外部方法使用C#的实现方法,较为详细的分析了外部方法使用C#的具体步骤与实现技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • C#判断访问来源是否为搜索引擎链接的方法

    C#判断访问来源是否为搜索引擎链接的方法

    这篇文章主要介绍了C#判断访问来源是否为搜索引擎链接的方法,实例分析了C#解析URL来源的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • DataTables List互相转换的实现类示例

    DataTables List互相转换的实现类示例

    这篇文章主要介绍了将DataTable转换为List,将List转换为DataTable的实现类实例方法,大家参考使用吧
    2013-11-11

最新评论