迈瑞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
相关产品推荐
相关产品推荐

