nachfolgender Code funktioniert Wenn ich Ihn normal als Procedure aufrufe super. Da es etwas lange dauert bis er alle
Com Schnittstellen geprüft hat. Wollte ich das Asynchron gestallten. Aber es kommt immer der Error : Das angegeben #SerialPort ist nicht inizialisiert.
Ist es ein grundsätzliches Problem oder mache ich was Falsch bei Threads????
Code: Alles auswählen
Procedure ChiChan_Find(*Wert)
; Suche ChiChan Controler
Protected timer,timeout=500,exit,b.s,thisChar.b,ComCount,a.l,i,t.s
Static AStringRead.b, AStringPuffer$, AStringLastChar.b, AStringFirstChar.b
If PortOpen=1
CloseSerialPort(0)
PortOpen = 0
PutStringToEditorGadget(">DisConnect")
Delay(100)
EndIf
Restore ComPort
Read.s b.s
While b.s<>"-1"
;Debug "Scan Com "+b
i= OpenSerialPort(0, b.s,57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
If i
Delay(100)
;Debug "Open"
ComCount = ComCount+1
WriteSerialPortString(0,".ChiChan"+Chr(13)+Chr(10),#PB_Ascii);+Chr(0))
While AvailableSerialPortOutput(0):Wend
AStringPuffer$ = ""
AStringFirstChar = 0
AStringLastChar = 0
timer = ElapsedMilliseconds() + timeout
exit = 0
While exit = 0
If AvailableSerialPortInput(0)
;Debug AvailableSerialPortInput(0)
EndIf
While AvailableSerialPortInput(0)
; Debug "Data found "
ReadSerialPortData(0, *MemoryID, 1)
thisChar = PeekB(*MemoryID)
AStringLastChar = thisChar
If thisChar > 31 ; ASCII Ab Space sind Daten
If AStringFirstChar = 0
AStringFirstChar = thisChar
EndIf
AStringPuffer$ = AStringPuffer$ + Chr(thisChar)
Else ; bei steuerzeichen beänden
If AStringFirstChar <> 0
exit = -1
EndIf
;Debug "**"
EndIf
Wend
If timer < ElapsedMilliseconds()
exit = -1
AStringPuffer$ = ""
;Debug "ChiChan not Found at "+b
EndIf
Wend
CloseSerialPort(0)
Delay(100)
;Debug AStringPuffer$
If AStringPuffer$ =".ChiChan" ; Das ist die echo antwort.
;Debug "ChiChan Found at "+b
ChiChanHaende = 1
Verbindung.l = 57600
PortName.s = b
Conect()
;Debug "ComCount "+Str(ComCount)
For i = 0 To ComCount-1
t = GetGadgetItemText(#Main_Port, i)
;Debug t
If GetGadgetItemText(#Main_Port, i) = PortName.s
SetGadgetState(#Main_Port, i)
;Debug "SetComport at "+Str(i)
EndIf
Next
i=0
Restore BaudData
Read.l a.l
While a.l<>-1
If GetGadgetItemText(#Main_Speed, i) = Str(Verbindung.l)
SetGadgetState(#Main_Speed, i)
;Debug "SSetComSpeed at "+Str(Verbindung.l)
EndIf
Read.l a.l
i=i+1
Wend
Break
EndIf
Else
;Debug "Port not Found at "+ b
EndIf
Read.s b.s
Wend
EndProcedure
An der Stelle habe ich bereits mehrfach auf die Schnittstelle zugegriffen.
*MemoryID ist ein Pufferfeld das ich am Anfang des Code deklariere : Global *MemoryID = AllocateMemory(1024)
Weis jemand was ich falsch mache ?
Gruss TFT