С одной стороны, у меня есть arduino
, подключенный через USB-кабель.Он вызывает Serial.println("ready")
каждые 100 миллисекунд в бесконечном цикле.
С другой стороны, у меня есть скрипт powershell с winforms
графическим интерфейсом, который имеет две кнопки Нажмите и Закрыть .Сценарий открывает последовательный порт и начинает прослушивать событие DataReceived
.
Ожидаемое поведение
Когда событие получено, его сообщение выводится на консоль.
Фактическое поведение
Когда никакие действия не выполняются, на консоль ничего не выводится, но каждый раз, когда я нажимаю кнопку Click , я получаю следующий вывод:
GOT VALUE FROM READLINE: ready
GOT VALUE FROM READLINE: ready
GOT VALUE FROM READLINE: ready
GOT VALUE FROM READLINE: ready
Click
Производится тот же выводкогда я нажимаю на кнопку Закрыть .
Дополнительная информация
Это как если бы процесс засыпал, пока я не выполню некоторые действия.Проснувшись, он выплевывает все, что получил, в свой буфер.Я думаю, это как-то связано с тем, как работает powershell event queue
.У меня не хватает глубины, господа.
Код
function main {
begin {
$global:latestPortMessage = ''
$form = createForm
$port = createAndOpenPort
}
process {
subscribeToPortEvents $port
[void]$form.ShowDialog()
}
end {
}
}
##### GUI CREATION HELPERS
function createForm {
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.Application]::EnableVisualStyles()
$FormStartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
$form = New-Object system.Windows.Forms.Form
$form.AutoSize = $true
$form.text = "Serial-test"
$form.TopMost = $false
$form.StartPosition = $FormStartPosition
$clickButton = createClickButton
$closeButton = createCloseButton
$form.controls.add($clickButton)
$form.controls.add($closeButton)
$form
}
function createClickButton {
$button = New-Object system.Windows.Forms.Button
$button.BackColor = "#e66b6b"
$button.text = "Click"
$button.width = 100
$button.height = 100
$button.Font = 'Microsoft Sans Serif,10,style=Bold'
$button.margin = 0
$button.Add_Click({ onClickButton })
$button
}
function createCloseButton {
$button = New-Object system.Windows.Forms.Button
$button.BackColor = "#e66b6b"
$button.text = "Close"
$button.width = 100
$button.height = 100
$button.location = '100,0'
$button.Font = 'Microsoft Sans Serif,10,style=Bold'
$button.margin = 0
$button.Add_Click({ onCloseButton })
$button
}
function onClickButton {
Write-Host "Click"
}
function onCloseButton {
closePort
unsubscribeFromPortEvents
$form.close()
}
##### PORT RELATED HELPERS
function createAndOpenPort {
param($portName = 'COM7', $baudRate = 9600)
$port = New-Object System.IO.Ports.SerialPort $portName,$baudRate,None,8,one
$port.open()
$port
}
function subscribeToPortEvents {
param($port)
Register-ObjectEvent -InputObject $port -EventName "DataReceived" -Action {
# $value = $Sender.ReadExisting()
$value = $Sender.ReadLine()
if ($value) {
Write-Host "GOT VALUE FROM READLINE: $value"
$global:latestPortMessage = $value.substring(0, $value.length - 2)
}
} | Out-Null
}
function unsubscribeFromPortEvents {
$subscribers = Get-EventSubscriber
$subscribers | foreach-object {
if ($_.SourceObject.GetType().FullName -eq "System.IO.Ports.SerialPort") {
Unregister-Event -SourceIdentifier $_.SourceIdentifier
}
}
}
function closePort {
try {
if ($port) {
if ($port.isOpen) {
$port.Close()
}
}
} catch {
logError $_
dumpError $_
}
}
. main
Чего мне не хватает?