无法解码迈瑞BS200医疗设备串口接收数据,找不到对应加密方式该如何解决?
迈瑞Mindray BS 200串口数据读取乱码解决方案
现有代码的核心问题
- 编码逻辑冲突:代码中设置了串口编码为ISO-8859-1(编码28591),但转字符串时强制使用
Encoding.ASCII解码,ASCII仅支持0-127的字符,高于127的字节会直接转为?,这是出现大量问号的核心原因。 - 读取逻辑错误:每次接收到
bytecount个字节,却只解码第1个字节拼接,剩余字节直接被丢弃,会导致数据大量缺失、格式错乱。 - 字节数组越界隐患:声明
Dim byteBuffer(bytecount) As Byte会创建长度为bytecount + 1的数组,多出来的1个字节默认是0,后续处理容易引入无效数据。
修复步骤
- 第一步:先确认串口基础参数匹配:首先要保证波特率、数据位、停止位、校验位和设备输出参数完全一致,迈瑞BS200默认串口参数一般为9600波特率、8数据位、1停止位、无校验,可优先用该配置测试。
- 第二步:修复编码解码逻辑:设备输出的是原始字节流,不需要提前设置
comPort.Encoding,先把所有字节完整接收存储,再按设备协议规定的编码解码,迈瑞设备国内版本一般用GB2312/GBK编码,海外版本用ASCII/UTF-8。 - 第三步:修正数据读取代码,正确的接收逻辑参考如下:
Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles comPort.DataReceived If e.EventType = SerialData.Chars Then Dim bytecount As Integer = comPort.BytesToRead If bytecount = 0 Then Return ' 声明长度匹配的字节数组 Dim byteBuffer(bytecount - 1) As Byte comPort.Read(byteBuffer, 0, bytecount) ' 先输出原始字节的十六进制格式确认数据有效性,避免乱码干扰 Dim hexStr As String = BitConverter.ToString(byteBuffer).Replace("-", " ") ' 确认字节数据正常后再按对应编码解码,国内设备用GB2312解码示例: ' Dim str As String = Encoding.GetEncoding("GB2312").GetString(byteBuffer) RaiseEvent ScanDataRecieved(hexStr) End If End Sub
- 第四步:按协议解析数据:迈瑞BS200支持ASTM 1394医疗设备通信协议,不是无格式的字符串输出,拿到的字节流需要按ASTM协议解析帧头、帧尾、校验位,拆分有效数据字段后才能得到可读内容,不要直接把整个字节流转为字符串。
- 硬件排查:确认串口线线序匹配,部分医疗设备需要专用串口线才能正常通信,排除硬件接触不良导致的字节错误。
内容的提问来源于stack exchange,提问作者Reagan
相关产品推荐
相关产品推荐

