为什么来自串行端口事件的$ event.messageData为空?

时间:2019-06-15 19:02:14

标签: powershell arduino

我正在尝试通过“ DataReceived”事件异步地从Arduino接收串行数据,但是$ event.messageData始终为空。

到目前为止,这是我的代码:

$port = New-Object System.IO.Ports.SerialPort COM7,9600,None,8,one
$port.Open()
$port | Format-List -Property *
Register-ObjectEvent -InputObject $port -EventName "DataReceived" -Action {
  $event | Format-List -Property * | Out-Host
}

以下是输出:

PORT

BaseStream             : System.IO.Ports.SerialStream
BaudRate               : 9600
BreakState             : False
BytesToWrite           : 0
BytesToRead            : 0
CDHolding              : False
CtsHolding             : False
DataBits               : 8
DiscardNull            : False
DsrHolding             : False
DtrEnable              : False
Encoding               : System.Text.ASCIIEncoding
Handshake              : None
IsOpen                 : True
NewLine                :

Parity                 : None
ParityReplace          : 63
PortName               : COM7
ReadBufferSize         : 4096
ReadTimeout            : -1
ReceivedBytesThreshold : 1
RtsEnable              : False
StopBits               : One
WriteBufferSize        : 2048
WriteTimeout           : -1
Site                   :
Container              :

EVENT

ComputerName     :
RunspaceId       : 67c40d50-5a9b-4022-974e-0a6a6518c2af
EventIdentifier  : 11
Sender           : System.IO.Ports.SerialPort
SourceEventArgs  : System.IO.Ports.SerialDataReceivedEventArgs
SourceArgs       : {COM7, System.IO.Ports.SerialDataReceivedEventArgs}
SourceIdentifier : 26c24bdb-8085-4e88-828e-44cb7897e416
TimeGenerated    : 6/16/2019 12:52:39 AM
MessageData      :

在arduino端,代码是:

Serial.printlf("ready")

当我使用同步方法时,一切正常

$port = New-Object System.IO.Ports.SerialPort COM7,9600,None,8,one
$port.Open()
$port.ReadLine()

输出

ready
ready
ready
...

请帮助!

1 个答案:

答案 0 :(得分:1)

$event.MessageData不是正确的查询属性-它包含通过{{3}引发 custom 事件时传递给
-MessageData参数的自定义数据}} cmdlet。

对于源自.NET的事件,通常是自动$EventArgs变量,其中包含事件特定的数据。

但是,在[System.IO.Ports.SerialPort]类型的DataReceived事件的特定情况下,似乎数据实际上并未作为事件 argument 传递,您必须改为使用$Sender对象访问原始[System.IO.Ports.SerialPort]实例,以调用其.ReadExisting()方法,由New-Event判断:

Register-ObjectEvent -InputObject $port -EventName "DataReceived" -Action {
  $Sender.ReadExisting() | Out-Host
}