2017-06-11 3 views
2

Kürzlich habe ich ein Projekt geschrieben, um Media Player mit Arduino und eine IR-Fernbedienung und ein PowerScript auf dem PC zu steuern, um die Informationen von Arduino über die serielle Schnittstelle zu empfangen.Arduino kommunizieren mit PC über PowerShell Skript

Das Problem ist, dass wie kann ich die Powershell Skript, um nur etwas zu tun, wenn es einige Eingaben von Arduino. Weil ich im Moment eine Schleife mit Verzögerung im Powershell-Skript habe und jedes Mal, wenn der Code ausgeführt wird, liest und prüft, ob es irgendwelche Eingaben von Arduino hat. Aber wie kann ich nicht warten, nur um das PowerShell-Skript auszulösen, wenn Arduino etwas sendet?

Hier ist meine Powershell-Skript:

$console = $host.UI.RawUI 
$console.BackgroundColor = "darkgreen" 
$console.ForegroundColor = "black" 
$size = $console.WindowSize 
$size.Width = 15 
$size.Height = 2 
$console.WindowSize = $size 
$buffer = $console.BufferSize 
$buffer.Width = 15 
$buffer.Height = 2 
$console.BufferSize = $buffer 

Write-Host "PC Media Remote" 

function IRinputText { 
    Param([string]$serialread,[string]$combo,[string]$key) 
    Process{If ($IRbuffer -like ("*"+$serialread)) {IRbufferReset;$wshell.SendKeys($combo+"{"+$key+"}")}} 
    } 
function IRinputHEX { 
    Param([string]$serialread,[string]$key) 
    Process{If ($IRbuffer -like ("*"+$serialread)) {IRbufferReset;$wshell.SendKeys([char]+$key)}} 
    } 
function IRbufferReset { 
    $Script:IRbuffer="" 
    $Script:IRbuffer= $Script:IRbuffer.PadLeft(15,'0') 
    } 

IRbufferReset 

$port= new-Object System.IO.Ports.SerialPort COM4,9600,None,8,one 
$wshell = New-Object -ComObject wscript.shell; 
$port.open() 
while($true) 
{ 
    $inputvar= $port.ReadExisting() -replace "`n","" -replace "`r","" 
    If(($inputvar -ne "")){ 
     $IRbuffer= If($IRbuffer.Length -ge $inputvar.Length){$IRbuffer.Substring($inputvar.Length) } 
     $IRbuffer= $IRbuffer + $inputvar 
     } 
    If($IRbuffer.Length -gt 15){$IRbuffer= $IRbuffer.Substring($IRbuffer.Length - 15);} 
    IRinputText -serialread "CH+" -combo "^" -key "UP" 
    IRinputText -serialread "CH-" -combo "^" -key "DOWN" 
    IRinputText -serialread "100+" -combo "^" -key "LEFT" 
    IRinputText -serialread "200+" -combo "^" -key "RIGHT" 
    IRinputText -serialread "CH" -key "f" 
    IRinputHEX -serialread "VOL+" -key "0xAF" 
    IRinputHEX -serialread "VOL-" -key "0xAE" 
    IRinputHEX -serialread "PLAY/PAUSE" -key "0xB3" 
    IRinputHEX -serialread "PREV" -key "0xB1" 
    IRinputHEX -serialread "NEXT" -key "0xB0" 
    IRinputHEX -serialread "EQ" -key "0xAD" 
    If ($IRbuffer -like ("*1532")) {IRbufferReset;Stop-Computer} 

    Start-Sleep -m 20 
} 
+1

Sie können Powershell zum DataReceived Ereignishandler rückruf, die von th ausgesetzt ist Die SerialPort-Klasse. (So ​​mache ich das mit meinen Arduinos) – bluuf

+0

@bluuf kannst du ein bisschen mehr ins Detail gehen? Ich bin ein absoluter Anfänger mit PowerShell. Vielen Dank! – raulx222

Antwort

1

Wenn Sie Firmata Protokoll auf Arduino verwenden, dann haben Arbeits I Beispiel für Powershell ereignisgesteuerte Schnittstelle mit Arduino als GPIO-Gerät zu kommunizieren, indem eine Net-Bibliothek namens Feststoff. Arduino (https://github.com/SolidSoils/Arduino)

add-type -path '.\Documents\WindowsPowerShell\Solid.Arduino.dll' 
$connection = New-Object Solid.Arduino.SerialConnection("COM4",[Solid.Arduino.SerialBaudRate]::Bps_57600) 
$session = New-Object Solid.Arduino.ArduinoSession($connection, 2000) 
$session.SetDigitalPinMode(4,[Solid.Arduino.Firmata.PinMode]::DigitalInput) 
# 
# Define the function that is called when a digitial pin event happens 
# 
function inputevent($event){ 
#Write-Host "Something happened on port $($event.value.port) Type $($event.value.pins)" 
if($event.value.pins -band 4) #using binary AND incase multiple inputs are activated 
{ 
    # put code here to switch ATEM Aux or VideoHub routing 
    Write-host "Cam 1 preview selected" 
} 
} 
# 
# set up the event to montor digital pin state change 
# 
$session.SetDigitalReportMode(0,$true) #enable events for pins on port 0 
Unregister-Event eventBitChange -ErrorAction SilentlyContinue #incase we are re-running the script 
$ArduinoEvent = Register-ObjectEvent -InputObject $session -EventName DigitalStateReceived -SourceIdentifier eventBitChange -Action {inputevent($eventArgs)} 

https://ianmorrish.wordpress.com/category/v-ise/arduino/

+0

Sie sollten den entsprechenden Code auch hier posten und nicht nur mit einem Link antworten. Antworten, die nicht über Code verfügen, werden für niedrige Qualität gelöscht. – Graham

Verwandte Themen