2

我正在尝试使用 PowerShell 设置与 ViewSonic Display 的串行端口通信。我发送打开或关闭显示状态的请求,应该得到 9 位回复 56 48 49 114 108 48 48 49 13 回复开启或 56 48 49 114 108 48 48 48 13 回复关闭 当我运行代码时,我只得到一个数字的回复当我添加第二次读取时,我得到了剩下的 8 个但是当我添加一个断点并使用调试器单步执行它时,我在第一次读取时得到了所有 9 个。任何想法可能导致这种奇怪的行为?关于更好的方法来做到这一点的任何建议?请参阅下面的代码和结果。

PS C:\Users\james\Desktop>  [Byte[]] $request = 0x38, 0x30, 0x31, 0x67, 0x6C, 0x30, 0x30, 0x30, 0x0D
$portreturn = [System.Byte[]]::CreateInstance([System.Byte], 9)
$port = new-Object System.IO.Ports.SerialPort COM3, 9600, None, 8, one
$port.Open()
$port.Write($request, 0, $request.Count)
$port.Read($portreturn, 0, $portreturn.Length)
Write-Host "portreturn1" $portreturn -foreground black -BackgroundColor white
$port.Read($portreturn, 0, $portreturn.Length)
Write-Host "portreturn2" $portreturn -foreground black -BackgroundColor white
$port.Close()

1个端口返回1 56 0 0 0 0 0 0 0 0

8 端口返回2 48 49 114 108 48 48 49 13 0

PS C:\Users\james\Desktop> C:\Users\james\Desktop\VStest2a.ps1

在 'C:\Users\james\Desktop\VStest2a.ps1:4' [DBG] 上点击行断点:PS C:\Users\james\Desktop>>

[DBG]: PS C:\Users\james\Desktop>>

[DBG]:PS C:\Users\james\Desktop>> 9

[DBG]: PS C:\Users\james\Desktop>> portreturn1 56 48 49 114 108 48 48 49 13

[DBG]: PS C:\Users\james\Desktop>>

为了清楚起见,链接到图片。 截屏

4

1 回答 1

1

这不是奇怪的行为,如果您在串行端口上使用Read() 方法,它可以正常发生。

串行端口至少以 1 字节为单位进行通信。没有像 TCP/IP 这样的数据包的概念。
您需要获取并保存 Read() 结果的数据和大小,并添加一个进程来检查是否所有数据都正常接收。
也许通过调整ReadTimeout 属性的值,有可能在接收到所有数据后完成 Read()。
但是,由于初始值应该是InfiniteTimeout,因此无法期望更改该值会产生任何影响。

或者,如果您收到的所有数据都是一个字符串,以 13(carriage return= \r) 结尾并且它没有出现在数据中间,您可以使用ReadTo() 方法
或者,您可以通过以类似方式调用ReadLine() 方法并将NewLine 属性设置为 13(carriage return= \r) 来获得类似的结果。

请尝试各种事情。

例如,如果数据的结尾是 10(line feed= \n),你可以像这篇文章那样调用它。
从串行端口写入和读取信息

于 2021-11-12T23:03:56.563 回答