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

PowerShell读取串口数据丢失字符、遗漏第二IMEI行问题求助

问题修复方案

根因说明

  • 编码问题:.NET SerialPort 类默认使用 ASCII编码,该编码遇到 \0(空字节,即你预期输出中显示的/0)时会将其识别为字符串结束符,直接截断后续内容,导致行尾后缀和第二IMEI行丢失。
  • AT命令发送不规范:大多数AT指令设备要求命令结尾携带\r\n作为结束标识,未正确添加结束符可能导致设备返回内容不完整。
  • 行结束符不匹配:SerialPort 默认的行结束符为\n,如果串口设备返回的行尾为\r\n,会导致ReadLine识别行边界出错。

修复后的代码

# 实例化串口对象
$connection = New-Object System.IO.Ports.SerialPort $samsPort,115200,None,8,1
# 显式设置编码为Latin-1,支持所有0-255字节,保留空字符
$connection.Encoding = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
# 显式设置行结束符匹配AT设备标准
$connection.NewLine = "`r`n"
# 打开串口
$connection.Open()
# 用WriteLine发送命令,自动追加行结束符
$connection.WriteLine("AT+IMEINUM")

While($true)
{
    $result = $connection.ReadLine()
    # 把空字符替换为可见的/0后输出
    Write-Host $result.Replace("`0", "/0")
    
    if($result -like "*OK*")
    {
        Break
    }
}
$connection.Close()

兜底兼容方案

如果修改后还是存在内容丢失,可以改用逐字节读取的方式,完全避开内置读取方法的截断逻辑:

$connection = New-Object System.IO.Ports.SerialPort $samsPort,115200,None,8,1
$connection.Encoding = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
$connection.Open()
$connection.WriteLine("AT+IMEINUM")

$buffer = New-Object byte[] 1024
$fullContent = @()
while($true) {
    $bytesRead = $connection.Read($buffer, 0, $buffer.Length)
    if($bytesRead -gt 0) {
        $chunk = $buffer[0..($bytesRead-1)]
        $fullContent += $chunk
        $strChunk = $connection.Encoding.GetString($chunk).Replace("`0", "/0")
        Write-Host $strChunk -NoNewline
        # 检查是否已收到OK标识
        if($connection.Encoding.GetString($fullContent) -like "*OK*") {
            break
        }
    }
}
$connection.Close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 20:06:04