PowerShell串口发送ASCII>127字符失败,Voltronic逆变器通信异常求助
问题解决:Voltronic逆变器串口通信CRC字节被替换的编码问题
问题根源
- 编码转换导致CRC字节丢失:你用字符串
'QPIGS·©r'发送时,PowerShell默认的串口编码(通常是ASCII)无法解析0xb7(中点符)和0xa9(版权符)这两个非ASCII字节,会自动替换为0x3f`(问号)。 - WriteLine方法自动追加换行符:
WriteLine会在字符串末尾添加0x0a(换行),但协议要求的是0x0d(回车),导致发送的结束符不符合要求。
解决方案:直接发送字节数组
绕过字符串编码转换,直接构造符合要求的字节数组发送,确保每个字节都准确传递:
# 初始化串口 $port = New-Object System.IO.Ports.SerialPort COM1, 2400, None, 8, One $port.ReadTimeout = 1000 $port.Open() # 构造指令字节数组:QPIGS(ASCII) + 0xb7 + 0xa9 + 0x0d(回车) $commandBytes = [byte[]]@( 0x51, 0x50, 0x49, 0x47, 0x53, # QPIGS的ASCII字节 0xb7, 0xa9, # CRC字节 0x0d # 回车符CR ) # 发送字节数组 $port.Write($commandBytes, 0, $commandBytes.Length) # 等待响应并读取 Start-Sleep -Milliseconds 300 $response = $port.ReadExisting() if ($response) { Write-Host "响应内容: $response" } else { Write-Host "未收到响应或响应为空" } # 关闭串口 $port.Close()
关键修改点说明
- 使用字节数组替代字符串:直接定义每个字节的十六进制值,完全避免编码转换带来的字节替换问题。
- 用Write方法替代WriteLine:
Write方法直接发送指定字节数组,不会自动添加额外的换行符,确保结束符是协议要求的0x0d。 - 简化读取逻辑:
ReadExisting一次性读取所有缓存的响应内容,比循环读取更简洁高效。
内容的提问来源于stack exchange,提问作者tinodivito
相关产品推荐
相关产品推荐

