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

PowerShell串口发送ASCII>127字符失败,Voltronic逆变器通信异常求助

问题解决:Voltronic逆变器串口通信CRC字节被替换的编码问题

问题根源

  1. 编码转换导致CRC字节丢失:你用字符串'QPIGS·©r'发送时,PowerShell默认的串口编码(通常是ASCII)无法解析0xb7(中点符)和0xa9(版权符)这两个非ASCII字节,会自动替换为0x3f`(问号)。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:20:34