使用Powershell向串口写入值

6
我该如何在 Powershell 中将 255 的值写入串口?

如何在 Powershell 中将值 255 写入串口?

$port= new-Object System.IO.Ports.SerialPort COM6,4800,None,8,one
$port.open()
$port.Write([char]255)
$port.Close()

前面脚本的输出结果是63(在串口监视器中查看)。

然而,$port.Write([char]127)的输出结果是127。如果值大于127,输出结果始终为63。

感谢您的帮助!


将串口的编码方式更改为28591。 - Owain Esau
请您举个例子好吗? - Spectrum
2个回答

4

尽管你尝试使用[char],但是由于PowerShell选择了Write方法的以下重载版本,因为你只传递了一个参数,所以你的参数被视为[string]

void Write(string text)

这个特定重载的文档说明(已添加强调):

默认情况下,SerialPort使用ASCIIEncoding对字符进行编码。ASCIIEncoding将所有大于127的字符编码为(char)63或'?'。要支持该范围内的其他字符,请将Encoding设置为UTF8Encoding、UTF32Encoding或UnicodeEncoding。


要发送字节值,必须使用以下重载:

void Write(byte[] buffer, int offset, int count)

这需要您:

  • 使用cast[byte[]]将您的字节值转换
  • 并指定offset - 起始字节位置以及count,从起始字节位置开始复制的字节数。

在您的情况下:

$port.Write([byte[]] (255), 0, 1)

注:(...)255 周围对于单个值不是必需的,但对于多个以 , 分隔的值是必需的。
注意:
  • 如果您想发送整个字符串,并且这些字符串包含 ASCII 范围之外的字符,则需要首先设置端口的字符编码,如此答案所示,该答案还基于获取基于所需编码的字符串的字节数组表示的替代解决方案(然后允许您使用与上面相同的方法重载)。

2
尝试类似这样的内容:
$port1 = new-Object System.IO.Ports.SerialPort COM1,4800,None,8,one
$port1.Open()
$data = [System.Text.Encoding]::UTF32.GetBytes([char]255)
$port1.Write( $data )
$port1.ReadExisting()
$port1
$port1.Close()

应该能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接