Hallo HHYayo,
ich hab mir jetzt nicht den ganzen anderen Thread durchgelesen, aber meine Erfahrung hat gezeigt, dass das Arbeiten mit COM-Schnittstellen manchmal ein wenig tricky ist.
Wenn Du wirre Zeichen erhälst kann es an einer falschen Bautrate, falschem Parity oder auch falschen Handshake liegen.
Manchmal hilft es aber auch, das Kabel einfach nochmal heraus zu ziehen, den COM-Partner auszuschalten, das Kabel wieder anzuschließen, sicher stellen, dass Dein Programm bereit für die Kommunikation ist und dann den COM-Partner neu zu starten.
Falls das auch nicht hilft, hab ich Dir mal hier ein paar Ausschnitte zusammen gestellt, wie ich bei uns mit verschiedenen Waagen kommuniziere.
Mit dieser Methode klappt das bei uns nun zuverlässig. Vieles ist nur Drumherumgeplänkel für Debug-Zwecke etc., aber das Wichtigste dürftest Du erkennen können.
Der Code ist so nicht lauffähig, aber vielleicht bekommst Du ja da ein paar Ideen die Du bei Dir noch ändern könntest:
Code: Alles auswählen
Global DebugMode = #False
Global AktSchritt.f = 1
;Global DebugMode = #True
#ComPort_Waage = 3
#ComPort_Timer = 123
If DebugMode
CreateDirectory("C:\Temp")
OpenFile(222,"C:\Temp\ComPort.LOG", #PB_File_Append)
EndIf
#WaagenTyp_KPZ = 1
#WaagenTyp_BOSCHE = 2
#Wiegung_Mindestgewicht = 0.05
#DataBase_Main = 0
Global AktuellesGewicht.f = 0
Global AktuellerTARA.f
Global COM_PortName.s = "COM1"
Global COM_Baud = 9600
Global COM_Parity = #PB_SerialPort_NoParity
Global COM_Bits = 8
Global COM_Stop = 1
Global COM_LenInputBuffer.l = 200
Global COM_InputBuffer.s = Space(COM_LenInputBuffer)
Global COM_BytesReceived.l
Global COM_ActLineText.s
Global COM_ActGewicht.f
Global COM_ActLineNumber.l
Global COM_LastLineNumber.l
; Global COM_WaagenTyp = #WaagenTyp_KPZ
; Global COM_HShake = #PB_SerialPort_NoHandshake
Global COM_WaagenTyp = #WaagenTyp_BOSCHE
Global COM_HShake = #PB_SerialPort_XonXoffHandshake
Global WiegungStabil = #True
If DebugMode
OpenConsole()
; PrintN("Bitte Handshaking auswählen:")
; PrintN("--------------------------------------------")
; PrintN(Str(#PB_SerialPort_NoHandshake)+" - #PB_SerialPort_NoHandshake")
; PrintN(Str(#PB_SerialPort_RtsHandshake)+" - #PB_SerialPort_RtsHandshake")
; PrintN(Str(#PB_SerialPort_RtsCtsHandshake)+" - #PB_SerialPort_RtsCtsHandshake")
; PrintN(Str(#PB_SerialPort_XonXoffHandshake)+" - #PB_SerialPort_XonXoffHandshake")
; PrintN("")
; COM_HShake = Val(Input())
EndIf
Procedure DebugN(Value.f)
Debug Value.f
If DebugMode
PrintN(StrF(Value))
EndIf
EndProcedure
Procedure DebugS(Value.s)
Debug Value.s
If DebugMode
PrintN(Value)
WriteStringN(222, FormatDate("%hh:%ii:%ss - ", Date()) + Value)
EndIf
EndProcedure
Global COMPort_OK = #True
If Not OpenSerialPort(#ComPort_Waage, COM_PortName, COM_Baud, COM_Parity, COM_Bits, COM_Stop, COM_HShake, 1024, 1024)
MessageRequester("FEHLER !!!", "Der Zugriff auf die serielle Schnittstelle '"+COM_PortName+"' ist fehlgeschlagen !!!"+#CR$+#CR$+"Es können somit keine Daten von der Seriellen-Schnittstelle abgerufen werden.", #PB_MessageRequester_Ok)
COMPort_OK = #False
EndIf
If DebugMode
DebugS("COM-Port gefunden: "+Str(COMPort_OK))
Select COM_HShake
Case #PB_SerialPort_NoHandshake
DebugS("Handshaking: #PB_SerialPort_NoHandshake")
Case #PB_SerialPort_RtsHandshake
DebugS("Handshaking: #PB_SerialPort_RtsHandshake")
Case #PB_SerialPort_RtsCtsHandshake
DebugS("Handshaking: #PB_SerialPort_RtsCtsHandshake")
Case #PB_SerialPort_XonXoffHandshake
DebugS("Handshaking: #PB_SerialPort_XonXoffHandshake")
Default
DebugS("Unbekanntes Handshaking: "+Str(COM_HShake))
EndSelect
EndIf
; --- Wenn COM-Port geöffnet werden konnte, dann iniziiere den Timer zur Auslesen des COM-Ports
If COMPort_OK
AddWindowTimer(#Window_Main, #ComPort_Timer, 100)
EndIf
; --- Event Loop mit permanenter Abfrage des Seriellen Ports
Repeat ;{ ----- Haupt Event-Schleife
Define event = WaitWindowEvent()
Select event
Case #PB_Event_Timer
If EventTimer() = #ComPort_Timer
; ---- ALLE Daten aus dem Serial-Port auslesen (solange bis er leer ist) ---
If AvailableSerialPortInput(#ComPort_Waage) Or AktuellesGewicht < 1
COM_ActLineText = ""
While AvailableSerialPortInput(#ComPort_Waage)
If AvailableSerialPortInput(#ComPort_Waage) < COM_LenInputBuffer
COM_BytesReceived = ReadSerialPortData(#ComPort_Waage, @COM_InputBuffer, AvailableSerialPortInput(#ComPort_Waage))
Else
COM_BytesReceived = ReadSerialPortData(#ComPort_Waage, @COM_InputBuffer, COM_LenInputBuffer)
EndIf
COM_ActLineText + PeekS(@COM_InputBuffer, COM_BytesReceived)
Wend
COM_ActLineText = "US,GS, 28.4KG"+#CRLF$+""+#CRLF$+" 28.8KG"+#CRLF$+"ST,GS, 28.8KG"
Select COM_WaagenTyp
Case #WaagenTyp_KPZ ; --- Datenauswertung für eine K-PZ Waage ---
Define ActCOMLine.s = COM_ActLineText
While Len(ActCOMLine)
COM_ActLineText = StringField(ActCOMLine, 1, #CRLF$)
ActCOMLine = Mid(ActCOMLine, Len(COM_ActLineText)+3)
If Len(COM_ActLineText) > 9
COM_ActLineNumber = Val(Left(COM_ActLineText,4))
If COM_ActLineNumber > 0 And COM_ActLineNumber <> COM_LastLineNumber
COM_ActGewicht = ValF(Trim(Mid(COM_ActLineText,5)))
COM_LastLineNumber = COM_ActLineNumber
AktuellesGewicht = COM_ActGewicht
Setze_Aktuelles_Gewicht(AktuellesGewicht)
; Beep_(2000,200)
Else
If FindString(COM_ActLineText,"S/N") : COM_LastLineNumber = 0 : EndIf
EndIf
EndIf
DebugS(Str(Len(COM_ActLineText))+" '"+COM_ActLineText+"' - "+Str(COM_LastLineNumber))
Wend
Case #WaagenTyp_BOSCHE ; --- Datenauswertung für eine BOSCHE Waage ---
Define ActCOMLine.s = COM_ActLineText
While Len(ActCOMLine)
COM_ActLineText = StringField(ActCOMLine, 1, #CRLF$)
ActCOMLine = Mid(ActCOMLine, Len(COM_ActLineText)+3)
If Left(COM_ActLineText,3) = "ST," Or Left(COM_ActLineText,3) = "US,"
WiegungStabil = #False : If StringField(COM_ActLineText,1,",") = "ST" : WiegungStabil = #True : EndIf
COM_ActLineText = Trim(StringField(COM_ActLineText,3,",")) ; Gewicht herausfiltern, z.B.: "28.8KG"
If Right(COM_ActLineText,2) = "KG"
AktuellesGewicht = ValD(COM_ActLineText)
Setze_Aktuelles_Gewicht(AktuellesGewicht)
DebugS("Neues Gewicht: " + Str(Len(COM_ActLineText))+" '"+COM_ActLineText+"' - "+Str(COM_LastLineNumber)+" - Akt. Gewicht: "+StrD(AktuellesGewicht,2))
Else
DebugS("ST/US, aber KG falsch: " + Str(Len(COM_ActLineText))+" '"+COM_ActLineText+"' - "+Str(COM_LastLineNumber)+" - Akt. Gewicht: "+StrD(AktuellesGewicht,2))
EndIf
EndIf
;Delay(1000)
Wend
EndSelect
DebugS(Str(Len(COM_ActLineText))+" '"+COM_ActLineText+"' - "+Str(COM_LastLineNumber)+" - Akt. Gewicht: "+StrD(AktuellesGewicht,2))
EndIf
EndIf
EndSelect
Until Window_Main_Events(event) = #False ;}
Grüße und viel Glück,
PL.