ich habe ein Problem bei der Speicherung von Objekten vom Typ System.IO.Ports.SerialPort in einem Object-Array, wenn ich diesen mit 'Add-Member' Properties hinzufüget habe. Ich zeige hier mal was ich meine:
Function OpenComPorts-ForGrblConnection { param ( [ValidateSet(300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600)] [Int] $Baudrate = 115200, [ValidateSet(7, 8)] [Int] $DataBits = 8, [ValidateSet('Even', 'Mark', 'None', 'Odd', 'Space')] [String] $Parity = 'None', [ValidateSet('None', 'One', 'OnePointFive', 'Two')] [String] $StopBits = 'One' ) $PortNames = [System.IO.Ports.SerialPort]::GetPortNames() $A = New-Object 'Object[]' $PortNames.Count For ($i=0; $i -le $PortNames.Count - 1; $i++) { $c = New-Object -TypeName System.IO.Ports.SerialPort $Port,$Baudrate,$Parity,$Databits,$StopBits #$A[$i] = $c $c.PortName = $PortNames[$i] $c.Open() If ($c.IsOpen) { $c.WriteLine('$I') $Response = $c.ReadExisting() $Response = $Response -split "\r\n" If ($Response[1] -eq "ok") { Add-Member -InputObject $c -MemberType NoteProperty -Name "GrblOk" -Value $true #-TypeName Bool If ($Response[0] -match "\d{8}") { $BuildDate = [System.DateTime]::ParseExact($Matches[0],"yyyyMMdd", $null) Add-Member -InputObject $c -MemberType NoteProperty -Name "BuildDate" -Value $BuildDate #-TypeName DateTime If ($Response[0] -match "\d{1}\.\d{1}[a-z]{1}") { Add-Member -InputObject $c -MemberType NoteProperty -Name "BuildVersion" -Value ($Matches[0]) #-TypeName String $A[$i] = $c } } } else { $c.Close() } } } Return $A }
Okay - der Code lässt sich nur sinnvoll mit entsprechender Hardware am Comport betreiben, aber das Prinzip sollte klar sein. Es werden nacheinander alle Comports geöffnet und bei der Kommunikation bestimmte Antworten erwartet. Add-Member fügt entsprechend NoteProperties zu den Serial-Objekten hinzu. Die Objektereferenz befinden sich zu dem Zeitpunkt noch nicht im Array, aber wenn ich die Zuweisung '$A[$i] = $c' mache gerät alles durcheinander.
Vermutlich mache ich mit dem Array etwas Grundsätzliches falsch. Hat jemand die Checkung :-)
Michael L.