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

