winform使用串口通信读取压力传感装置(CFM)的数据

一、简介
  1. 目的:获取CFM的 “hi” 报文,解析出如下数据并绘制波形图。
    在这里插入图片描述
    在这里插入图片描述
  2. 实现:使用c#打开CFM串口,发送 02 00 02 4C 49 0D 请求到串口,CFM就会不断返回不同类型的报文,我解析的是 “hi” 报文(至于什么是 “hi” 报文,请看协议),这一步称为登录。接下来就是接收CFM发送过来的报文,然后处理。实现的核心就这两步,是不是很简单。
  3. 效果如下
    在这里插入图片描述
二、准备
  1. 首先当然是要有一个压力传感装置。
    在这里插入图片描述
  2. 安装压力传感装置软件 AP02PC,安装这个软件后自动安装了USB转串口驱动,无需另外安装驱动,但要安装合适版本(上图右上角有版本),不合适可能用不了
    在这里插入图片描述
    下面是我使用的协议和软件,还有一个串口调试助手。
    链接:百度网盘
    提取码:3r0v
  3. 连接压力传感装置,右键点击此电脑,点击管理,点击设备管理器,找到压力传感装置使用的端口,如下图,我这里是 COM4。
    在这里插入图片描述
  4. 测试电脑USB转串口驱动是否安装好,以及CFM是否连接正常,打开AP02PC软件,点击选项,选择端口号(我这里的端口号是COM4),点击登录,登录之后会出现如下的波形图及数据。这样就说明可以开始连接CFM了。
    在这里插入图片描述
三、使用c#winform连接CFM
  1. 准备一个文本框,用于显示发过来的报文。
  2. 从工具箱拖入一个 SerialPort ,这个就是串口对象,按照协议设置波特率为 128000,ReadButterSize我设置为40960防止溢出,PortName在代码中设置(我的是COM4)。
    在这里插入图片描述
  3. 添加两个按钮,用于登入、登出,还有一个ComboBox,用于选择串口,如下图。
    在这里插入图片描述
  4. 登入的代码,就这样简单的代码,就是把02 00 02 4C 49 0D这6个字节发送到CFM,接下来CFM就会不断返回报文。
private void btn_login_Click(object sender, EventArgs e)
{
   
    if (cbb_COM.SelectedIndex == -1)
    {
   
        MessageBox.Show("选择串口");
        return;
    }
    // 获取系统中可用的串口名称
    string[] availablePorts = SerialPort.GetPortNames();
    // 检查指定的串口是否存在于可用串口列表中
    string portName = cbb_COM.Text;
    bool isPortAvailable = availablePorts.Contains(portName);
    if (isPortAvailable)
    {
   
        // 串口可用
        ;
    }
    else
    {
   
        // 串口不可用
        MessageBox.Show("串口不可用");
    }
    try
    {
   
        serialPort1.PortName = cbb_COM.Text;
        // 打开串口
        if (!serialPort1.IsOpen) {
    
            serialPort1.Open(); 
        }
        // 发送请求到串口02 00 02 4C 49 0D
        serialPort1.Write(new byte[] {
    0x02, 0x00, 0x02, 0x4C, 0x49, 0x0D }, 0, 6);
    }
    catch (Exception ex)
    {
   
        MessageBox.Show("无法打开串口: " + ex.Message);
    }
}
  1. 处理接收到的数据,串口绑定DataReceived事件,代码也是很简单,因为我处理的是“hi”报文,所以设置缓冲区字节数大于 800 再去读取及处理。
    在这里插入图片描述
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   
    //this.Invoke(new EventHandler(UpdateUIText));
    // 读取串口接收的数据
    //Thread.Sleep(100);
    try
    {
   
        int bytesToRead = serialPort1.BytesToRead;
        if (bytesToRead > 800)
        {
   
            byte[] buffer = new byte[serialPort1.BytesToRead];
            serialPort1.Read(buffer, 0, serialPort1.BytesToRead);
            serialPort1.DiscardInBuffer();
            DealWithCFMData(buffer);
        }
    }
    catch (Exception)
    {
   
        //throw;
    }
}
四、处理接收到的数据
  1. 判断是不是"hi"报文非常简单,报文的开头格式如下
    在这里插入图片描述
    那么“hi”报文的第4第5个字节就是 “hi”,它们的ASCII码转换成16进制是 68 69,如下
    在这里插入图片描述
  2. 报文中数据的解析方法,例如峰值原始值,是一个占四个字节的整数,它在报文中的起始是第376个字节,索引是375(这个数已经加上了开头的STX、LNG、CMD这5个字节)
    在这里插入图片描述
    峰值原始值的解析如下
    BitConverter.ToInt32(new byte[] { buffer[378], buffer[377], buffer[376], buffer[375] }, 0)
    还有其他值的解析,都是要高低字节反转的。
    在这里插入图片描述
五、附源代码

链接:添加链接描述
提取码:p2nx

相关推荐

  1. C51--DHT11数据读取通过串口--LCD显示

    2023-12-06 14:14:02       29 阅读
  2. 基于单片机数据串口通信研究

    2023-12-06 14:14:02       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 14:14:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 14:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 14:14:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 14:14:02       20 阅读

热门阅读

  1. 基于springboot + vue学校后勤管理系统

    2023-12-06 14:14:02       36 阅读
  2. 前端webpack、vite搭建的项目如何解决跨域

    2023-12-06 14:14:02       42 阅读
  3. RocketMQ消息过滤机制源码详解

    2023-12-06 14:14:02       28 阅读
  4. rust从0开始写项目-04-多样化错误处理

    2023-12-06 14:14:02       38 阅读
  5. 英伟达显卡驱动的相关组件和名词

    2023-12-06 14:14:02       43 阅读
  6. springboot-mongodb-连接配置

    2023-12-06 14:14:02       30 阅读
  7. 解决 nginx 504 Gateway Time-out报错问题

    2023-12-06 14:14:02       42 阅读