You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迈瑞Mindray BS 200医疗设备串口接收数据解码及C#代码求助

迈瑞Mindray BS200串口数据读取解决方案

串口接收数据截图

排查方向

  • 先核对串口参数:迈瑞BS200默认串口配置为9600波特率、8位数据位、1位停止位、无奇偶校验,需和设备端输出配置完全一致,参数不匹配会直接产生乱码。
  • 确认通信协议:该设备遵循ASTM LIS2A2医疗设备通信协议,输出的不是纯文本内容,而是结构化的帧数据,不能直接整体转字符串解码:
    • 单帧以0x02(STX控制字符)开头,0x03(ETX控制字符)结尾
    • 帧内有效数据段为ASCII编码,额外包含帧序号、校验位等标识位
  • 避免编码误判:先将接收到的所有字节输出为16进制日志,匹配STX、ETX标识确认完整帧结构后,再提取中间数据段转码,不要直接用UTF8/GBK对全部接收字节转码。

C# 接收解析示例代码

using System.IO.Ports;
using System.Text;
using System.Collections.Generic;
using System.Linq;

public class MindrayBS200Parser
{
    private readonly SerialPort _serialPort;
    private readonly List<byte> _receiveBuffer = new List<byte>();
    private const byte STX = 0x02;
    private const byte ETX = 0x03;

    public void Start(string serialPortName)
    {
        _serialPort = new SerialPort(serialPortName, 9600, Parity.None, 8, StopBits.One);
        _serialPort.DataReceived += SerialPortDataReceived;
        _serialPort.Open();
    }

    private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        var readCount = _serialPort.BytesToRead;
        var buffer = new byte[readCount];
        _serialPort.Read(buffer, 0, readCount);
        _receiveBuffer.AddRange(buffer);

        while (TryExtractValidFrame(out var validData))
        {
            // 此处自行处理解析到的有效业务数据
            System.Diagnostics.Debug.WriteLine(validData);
        }
    }

    private bool TryExtractValidFrame(out string validData)
    {
        validData = string.Empty;
        var stxPos = _receiveBuffer.IndexOf(STX);
        var etxPos = _receiveBuffer.IndexOf(ETX);

        if (stxPos >= 0 && etxPos > stxPos)
        {
            // 提取STX和ETX之间的有效数据段
            var dataBytes = _receiveBuffer.Skip(stxPos + 1).Take(etxPos - stxPos - 1).ToArray();
            validData = Encoding.ASCII.GetString(dataBytes);
            // 移除已解析的缓冲区内容
            _receiveBuffer.RemoveRange(0, etxPos + 1);
            return true;
        }

        // 缓冲区超过1K无有效帧则清空,避免内存溢出
        if (_receiveBuffer.Count > 1024)
        {
            _receiveBuffer.Clear();
        }
        return false;
    }

    public void Stop()
    {
        if (_serialPort.IsOpen)
        {
            _serialPort.Close();
        }
        _serialPort.Dispose();
    }
}

注:若设备开启了校验规则,需额外提取数据段末尾的两位16进制校验和,按ASTM LIS2A2标准规则计算比对后再使用数据。

内容的提问来源于stack exchange,提问作者Reagan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:36:09