События последовательного порта не принимаются, пока не выполнено какое-либо действие - PullRequest
0 голосов
/ 30 июня 2019

С одной стороны, у меня есть 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

Производится тот же выводкогда я нажимаю на кнопку Закрыть .enter image description here

Дополнительная информация

Это как если бы процесс засыпал, пока я не выполню некоторые действия.Проснувшись, он выплевывает все, что получил, в свой буфер.Я думаю, это как-то связано с тем, как работает 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

Чего мне не хватает?

1 Ответ

0 голосов
/ 02 июля 2019

У меня есть решение моей проблемы, но оно кажется очень хакерским.Я просто добавил System.Windows.Forms.Timer.Он запускается каждые 1 мс и выполняет обработчик, который обрабатывает входные данные последовательного порта и обновляет графический интерфейс, если это необходимо.

Снимок экрана :

enter image description here

Код

Github

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...