一、简介
- 目的:获取CFM的 “hi” 报文,解析出如下数据并绘制波形图。
- 实现:使用c#打开CFM串口,发送 02 00 02 4C 49 0D 请求到串口,CFM就会不断返回不同类型的报文,我解析的是 “hi” 报文(至于什么是 “hi” 报文,请看协议),这一步称为登录。接下来就是接收CFM发送过来的报文,然后处理。实现的核心就这两步,是不是很简单。
- 效果如下
二、准备
- 首先当然是要有一个压力传感装置。
- 安装压力传感装置软件 AP02PC,安装这个软件后自动安装了USB转串口驱动,无需另外安装驱动,但要安装合适版本(上图右上角有版本),不合适可能用不了
下面是我使用的协议和软件,还有一个串口调试助手。
链接:百度网盘
提取码:3r0v - 连接压力传感装置,右键点击此电脑,点击管理,点击设备管理器,找到压力传感装置使用的端口,如下图,我这里是 COM4。
- 测试电脑USB转串口驱动是否安装好,以及CFM是否连接正常,打开AP02PC软件,点击选项,选择端口号(我这里的端口号是COM4),点击登录,登录之后会出现如下的波形图及数据。这样就说明可以开始连接CFM了。
三、使用c#winform连接CFM
- 准备一个文本框,用于显示发过来的报文。
- 从工具箱拖入一个 SerialPort ,这个就是串口对象,按照协议设置波特率为 128000,ReadButterSize我设置为40960防止溢出,PortName在代码中设置(我的是COM4)。
- 添加两个按钮,用于登入、登出,还有一个ComboBox,用于选择串口,如下图。
- 登入的代码,就这样简单的代码,就是把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);
}
}
- 处理接收到的数据,串口绑定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;
}
}
四、处理接收到的数据
- 判断是不是"hi"报文非常简单,报文的开头格式如下
那么“hi”报文的第4第5个字节就是 “hi”,它们的ASCII码转换成16进制是 68 69,如下
- 报文中数据的解析方法,例如峰值原始值,是一个占四个字节的整数,它在报文中的起始是第376个字节,索引是375(这个数已经加上了开头的STX、LNG、CMD这5个字节)
峰值原始值的解析如下
BitConverter.ToInt32(new byte[] { buffer[378], buffer[377], buffer[376], buffer[375] }, 0)
还有其他值的解析,都是要高低字节反转的。
五、附源代码
链接:添加链接描述
提取码:p2nx