我正在尝试通过“ 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
...
请帮助!
答案 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
}