Почему $ event.messageData из события последовательного порта пусто? - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь получить последовательные данные от Arduino асинхронно через событие «DataReceived», но $ 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 Ответ

1 голос
/ 15 июня 2019

$event.MessageData не является подходящим свойством для запроса - он содержит пользовательские данные, передаваемые параметру
-MessageData при вызове события custom через New-Eventcmdlet.

Для событий, создаваемых в .NET, обычно это автоматическая переменная $EventArgs, которая содержит данные, относящиеся к событию.

В конкретном случае [System.IO.Ports.SerialPort] типа * 1015Однако для события * кажется, что данные на самом деле не передаются как событие аргумент , и вместо этого вы должны использовать объект $Sender, чтобы получить доступ к исходному экземпляру [System.IO.Ports.SerialPort], чтобы вызватьметод .ReadExisting(), судя по образцу кода в официальных документах :

Register-ObjectEvent -InputObject $port -EventName "DataReceived" -Action {
  $Sender.ReadExisting() | Out-Host
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...