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
}
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
@bluuf kannst du ein bisschen mehr ins Detail gehen? Ich bin ein absoluter Anfänger mit PowerShell. Vielen Dank! – raulx222