RS232-komunikation veränder Variable Kategorie: Verschiedenes (von Max - 8.04.2015 12:32) | |
| |
Hallo, in meinen Projekt habe ich als Master einen AVR32 und als Slave einen MEGA32. Beide sind über die Serielle Schnittstelle ( 30 cm lang) miteinander verbunden. Vom Master werden Einstellungswerte gesendet und der Slave schickt seine gemessenen Temperaturwerte zurück. Das klappt auch einigerma�en, es sind nur relativ viele Fehlversuche dabei. Aber jetzt zum gro�e Problem. Die globalen Variablen vEFeAuWo veFeZuWo veFeAuGa veFeZuGa veFeAuBa veFeAuBa veFeAuWC veFeZuWC werden während Kommunikation verändert bzw gelöscht. Diese Variablen werden nur einmal in der Routine Init() mit Werten aus der SD initiiert. Im weiteren Programmverlauf werden sie nur für Vergleichsoperationen herangezogen. Das hei�t, hier dürfte sich nichts verändern. Kann mir jemand weiterhelfen. Max Hier der Code vom Master: Dim vEFeAuWo As Byte Dim veFeZuWo As Byte Dim veFeAuGa As Byte Dim veFeZuGa As Byte Dim veFeAuBa As Byte Dim veFeZuBa As Byte Dim veFeAuWC As Byte Dim veFeZuWC As Byte Dim vBuffer(255) As Byte 'Puffer für RS232 Dim vFC As Byte 'Fehlerzähler Dim vZS(10) As Byte 'Zwischenspeicher für komischen Fehler Sub Slave(vVWo As Byte, vVGa As Byte, vVBa As Byte, vVWC As Byte, vSWo As Byte, vSGa As Byte, vSBa As Byte, vSWC As Byte) Dim vC As Integer Dim vP As Integer Dim vX As Integer Dim vT As Long Dim vFehlerByte As Byte 'gibt Fehlermeldungen an den Slave weiter Dim vData(80) As Byte Dim vVentilauswahl As Byte Dim vEmpf As Byte 'ist True wenn sich Zeichen im Empfanspufer befinden 'wird hier zwischengespeichert weil die Variablen auf dem weg durch diese Routine gelöscht werden vZS(0) = veMZU : vZS(1) = veMAuf vZS(2) = vEFeAuWo : vZS(3) = veFeZuWo : vZS(4) = veFeAuGa : vZS(5) = veFeZuGa vZS(6) = veFeAuBa : vZS(7) = veFeAuBa : vZS(8) = veFeAuWC : vZS(9) = veFeZuWC vFC = 0 vEmpf = False Serial_Init_IRQ(0,vBuffer,255,255,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD9600) 'RS232-Schnittstelle Lab RSStart AbsDelay(300) If vFC > 19 Then vStoerung = 52 vStoerTextLCD1 = "20 Fehler bei" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "RS232 52" 'Störtext für LCD Zeile 2 vTextSD = "10 Fehler bei 10 Fehler St.Nr.52" 'Störtext für Protokolldatei Protokoll() 'Störung in Protokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab vNeustart = 1 'Flag für einen Neustart setzen End If 'vAnzeigeStop = 1 'LCD nicht aktualisieren vVentilauswahl = 0 'die Bits für die Ventilauswahl setzten If vVWo = 1 Then vVentilauswahl = vVentilauswahl + 0b00000001 End If If vVGa = 1 Then vVentilauswahl = vVentilauswahl + 0b00000010 End If If vVBa = 1 Then vVentilauswahl = vVentilauswahl + 0b00000100 End If If vVWC = 1 Then vVentilauswahl = vVentilauswahl + 0b00001000 End If Do While True vP = Serial_ReadExt(0) 'Empfangspuffer leeren If vP = &H100 Then : Exit : End If End While Serial_Write(0,245) 'Startsequen senden Serial_Write(0,7) Serial_Write(0,248) Serial_Write(0,36) Serial_Write(0,vVentilauswahl) 'Ventilauswahl senden Serial_Write(0,vSWo) 'Ventielstufen senden Serial_Write(0,vSGa) Serial_Write(0,vSBa) Serial_Write(0,vSWC) Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,vFehlerByte) 'Fehler senden Serial_Write(0,vVentilauswahl) 'Ventilauswahl senden 2. mal Serial_Write(0,vSWo) 'Ventielstufen senden 2. mal Serial_Write(0,vSGa) Serial_Write(0,vSBa) Serial_Write(0,vSWC) Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,vFehlerByte) 'Fehler senden Serial_Write(0,36) 'Startsequen senden Serial_Write(0,248) Serial_Write(0,7) Serial_Write(0,245) AbsDelay(500) vTOut = 0 Do While True vX = Serial_IRQ_Info(0,RS232_FIFO_RECV) 'es geht erst weiter wenn min 78 Byte empfangen wurden If vX >= 78 Then : Exit : End If If vX > 0 And vEmpf = False Then 'sind Zeichen im Empfangspuffer vT = vTOut 'aktuelle timerzeit speichern vEmpf = True End If If (vTOut - vT) > 500 And vEmpf = True Then 'sind 5 sec vergangen nach dem der Empfangspuffer Date empfangen hat vFC = vFC + 1 'Fehlerzähler Msg_WriteText("Fehler unvollständiger Empfangspuffer " ):Msg_WriteInt(vFC ):Msg_WriteChar(13 ) Goto RSStart 'aber nicht vollständig gefüllt wurde End If 'Empfang zurücksetzen If vTOut > 3500 Then 'sind mehr als 35 sec vergangen 6000 = 1 min vStoerung = 51 vStoerTextLCD1 = "TimeOut bei" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "RS232 Empfang 51" 'Störtext für LCD Zeile 2 vTextSD = "TimeOut bei RS232 Empfang St.Nr.51" 'Störtext für Protokolldatei Protokoll() 'Störung in Protokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab vNeustart = 1 'Flag für einen Neustart setzen End If End While Msg_WriteText("vFeAuXX A "):Msg_WriteInt( vEFeAuWo):Msg_WriteText(" " ):Msg_WriteInt( veFeZuWo):Msg_WriteText(" " ) Msg_WriteInt( veFeAuGa):Msg_WriteText(" " ):Msg_WriteInt( veFeZuGa) Msg_WriteText(" " ):Msg_WriteInt( veFeAuBa):Msg_WriteText(" " ):Msg_WriteInt( veFeZuBa):Msg_WriteText(" " ) Msg_WriteInt( veFeAuWC):Msg_WriteText(" " ):Msg_WriteInt( veFeZuWC):Msg_WriteText("r" ) vP = Serial_ReadExt(0) 'Fehlerzahl von Slave 10101010 = OK vX = Serial_ReadExt(0) 'Fehlerzahl von Slave 01010101 = OK If vP <> 0b10101010 Or vX <> 0b01010101 Then vFC = vFC + 1 'Fehlerzähler Msg_WriteText("Quittungszahlen von Slave falsch vFC=" ) : Msg_WriteInt(vFC ):Msg_WriteChar(13 ) Goto RSStart End If vX = 0 Do While True vP = Serial_ReadExt(0) 'Daten von Empfangspuffer lesen vData(vX) = vP 'und in die Datenbank schreiben vX++ If vP = &H100 Then : Exit : End If 'Ende der Daten End While '___________________________________________________________ Msg_WriteText("vData(72 - 75) "):Msg_WriteInt( vData(72)):Msg_WriteText(" " ):Msg_WriteInt( vData(73)):Msg_WriteText(" " ) Msg_WriteInt( vData(74)):Msg_WriteText(" " ):Msg_WriteInt( vData(75)):Msg_WriteChar(13 ) If vData(0) = 245 And vData(1) = 7 And vData(2) = 248 And vData(3) = 37 And _ vData(72) = 37 And vData(73) = 248 And vData(74) = 7 And vData(75) = 245 Then 'Anfangs und Schlusssequenz prüfen For vC = 0 To 33 Msg_WriteInt(vData(vC + 4) ):Msg_WriteText("-" ):Msg_WriteInt(vData(vC + 38) ):Msg_WriteText(" " ) If vData(vC + 4)<> vData(vC + 38) Then 'ersten mit zweiten Datensatz vergleichen vFC = vFC + 1 'Fehlerzähler Msg_WriteText("Fehler Temperaturdaten " ):Msg_WriteInt(vFC ):Msg_WriteChar(13 ) Goto RSStart End If Next Msg_WriteChar(13 ) vTWWohnz = vData(5) : vTWWohnz = vTWWohnz << 8 : vTWWohnz = vTWWohnz + vData(4) 'Temperaturwert aus Hbyte + LByte vTZWohnz = vData(7) : vTZWohnz = vTZWohnz << 8 : vTZWohnz = vTZWohnz + vData(6) 'Temperaturwert aus Hbyte + LByte vTRWohnz = vData(9) : vTRWohnz = vTRWohnz << 8 : vTRWohnz = vTRWohnz + vData(8) 'Temperaturwert aus Hbyte + LByte vTBGang = vData(11) : vTBGang = vTBGang << 8 : vTBGang = vTBGang + vData(10) 'Temperaturwert aus Hbyte + LByte vTZGang = vData(13) : vTZGang = vTZGang << 8 : vTZGang = vTZGang + vData(12) 'Temperaturwert aus Hbyte + LByte vTRGang = vData(15) : vTRGang = vTRGang << 8 : vTRGang = vTRGang + vData(14) 'Temperaturwert aus Hbyte + LByte vTBBad = vData(17) : vTBBad = vTBBad << 8 : vTBBad = vTBBad + vData(16) 'Temperaturwert aus Hbyte + LByte vTZBad = vData(19) : vTZBad = vTZBad << 8 : vTZBad = vTZBad + vData(18) 'Temperaturwert aus Hbyte + LByte vTRBad = vData(21) : vTRBad = vTRBad << 8 : vTRBad = vTRBad + vData(20) 'Temperaturwert aus Hbyte + LByte vTBWC = vData(23) : vTBWC = vTBWC << 8 : vTBWC = vTBWC + vData(22) 'Temperaturwert aus Hbyte + LByte vTZWC = vData(25) : vTZWC = vTZWC << 8 : vTZWC = vTZWC + vData(24) 'Temperaturwert aus Hbyte + LByte vTRWC = vData(27) : vTRWC = vTRWC << 8 : vTRWC = vTRWC + vData(26) 'Temperaturwert aus Hbyte + LByte vTVorlOben = vData(29) : vTVorlOben = vTVorlOben << 8 : vTVorlOben = vTVorlOben + vData(28) vVentilstufeWo = vData(31) 'aktuelle Ventilstufen übergeben vVentilstufeGa = vData(32) vVentilstufeBa = vData(33) vVentilstufeWC = vData(34) AbsDelay(100) Serial_Disable(0) 'RS232 abschalten TempMessung() 'Temperaturen des Masters messen Else vFC = vFC + 1 'Fehlerzähler Msg_WriteText("Fehler Anfangs und Schlusssequenz prüfen " ):Msg_WriteInt(vFC ):Msg_WriteChar(13 ) Goto RSStart End If Msg_WriteText("vFeAuXX B "):Msg_WriteInt( vEFeAuWo):Msg_WriteText(" " ):Msg_WriteInt( veFeZuWo):Msg_WriteText(" " ) Msg_WriteInt( veFeAuGa):Msg_WriteText(" " ):Msg_WriteInt( veFeZuGa) Msg_WriteText(" " ):Msg_WriteInt( veFeAuBa):Msg_WriteText(" " ):Msg_WriteInt( veFeZuBa):Msg_WriteText(" " ) Msg_WriteInt( veFeAuWC):Msg_WriteText(" " ):Msg_WriteInt( veFeZuWC):Msg_WriteText("r" ) If vData(30) > 6 And vData(30) < 15 Then 'bei Störmeldungen vom Slave vStoerung = vData(30) 'Störungsnummer an lokale Varable übergeben Select Case vData(30) 'Störungszahlen von Slave selektieren Case 7 vStoerTextLCD1 = "TimeOut Wohnz." 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil AUF" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil Wohnzimmer Endschalter AUF wurde nicht erreicht St.Nr.7" 'Störtext für Protokolldatei Case 8 vStoerTextLCD1 = "TimeOut Gang" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil AUF" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil Gang Endschalter AUF wurde nicht erreicht St.Nr.8" 'Störtext für Protokolldatei Case 9 vStoerTextLCD1 = "TimeOut Bad" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil AUF" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil Bad Endschalter AUF wurde nicht erreicht St.Nr.9" 'Störtext für Protokolldatei Case 10 vStoerTextLCD1 = "TimeOut WC" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil AUF" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil WC Endschalter AUF wurde nicht erreicht St.Nr.10" 'Störtext für Protokolldatei Case 11 vStoerTextLCD1 = "TimeOut Wohnz." 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil ZU" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil Wohnzimmer Endschalter ZU wurde nicht erreicht St.Nr.11" 'Störtext für Protokolldatei Case 12 vStoerTextLCD1 = "TimeOut Gang" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil ZU" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil Gang Endschalter ZU wurde nicht erreicht St.Nr.12" 'Störtext für Protokolldatei Case 13 vStoerTextLCD1 = "TimeOut Bad" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil ZU" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil Bad Endschalter ZU wurde nicht erreicht St.Nr.13" 'Störtext für Protokolldatei Case 14 vStoerTextLCD1 = "TimeOut WC" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Ventil ZU" 'Störtext für LCD Zeile 2 vTextSD = "Fehler Ventil WC Endschalter ZU wurde nicht erreicht St.Nr.14" 'Störtext für Protokolldatei End Select Protokoll() 'Störung in Protokolldatei speichern vNeustart = 1 'Flag für einen Neustart setzen StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab End If AbsDelay(200) 'wird hier zurückgespeichert weil die Variablen auf dem weg durch diese Routine gelöscht werden veMZU = vZS(0): veMAuf = vZS(1) vEFeAuWo = vZS(2) : veFeZuWo = vZS(3) : veFeAuGa = vZS(4) : veFeZuGa = vZS(5) veFeAuBa = vZS(6) : veFeAuBa = vZS(7) : veFeAuWC = vZS(8) : veFeZuWC = vZS(9) End Sub Hier das Ausgabeprotokoll: Interpreter gestartet - 64kb RAM SYSDaten gelesen SDC_Init x 0 vFeAuXX A 4 2 4 2 4 2 4 2 vData(72 - 75) 232 1 14 4 Fehler Anfangs und Schlusssequenz prüfen 1 vFeAuXX A 0 0 0 0 0 0 15 36 vData(72 - 75) 0 190 0 36 Fehler Anfangs und Schlusssequenz prüfen 2 vFeAuXX A 0 0 0 0 0 0 15 36 vData(72 - 75) 37 248 7 245 195-195 0-0 192-192 0-0 193-193 0-0 191-191 0-0 196-196 0-0 190-190 0-0 195-195 0-0 194-194 0-0 191-191 0-0 197-197 0-0 196-196 0-0 195-195 0-0 190-190 0-0 36-36 0-0 0-0 0-0 0-0 0-0 0-0 0-0 Wand Wohnzimmer 195 Zimmer Wohnzimmer 192 Rücklauf Wohnzimmer 193 Boden Gang 191 Zimmer Gang 196 Rücklauf Gang 190 Boden Bad 195 Zimmer Bad 194 Rücklauf Bad 191 Boden WC 197 Zimmer WC 196 Rücklauf WC 195 Vorlauf unten 185 Vorlauf Oben 190 Aussen 187 Kessel 188 vFeAuXX B 0 0 0 0 0 0 15 36 Mischer Pos in MPVNull -2 Anfang veMZU-- 0 25 vFeAuXX A 4 2 4 2 4 0 4 2 Quittungszahlen von Slave falsch vFC=1 vFeAuXX A 0 0 0 0 0 0 0 36 vData(72 - 75) 37 248 7 245 Fehler Anfangs und Schlusssequenz prüfen 2 vFeAuXX A 0 0 0 0 0 0 0 36 vData(72 - 75) 37 248 7 245 195-195 0-0 192-192 0-0 192-192 0-0 190-190 0-0 195-195 0-0 190-190 0-0 195-195 0-0 193-193 0-0 190-190 0-0 196-196 0-0 195-195 0-0 193-193 0-0 190-190 0-0 0-0 0-0 0-0 0-0 0-0 0-0 0-0 0-0 Wand Wohnzimmer 195 Zimmer Wohnzimmer 192 Rücklauf Wohnzimmer 192 Boden Gang 190 Zimmer Gang 195 Rücklauf Gang 190 Boden Bad 195 Zimmer Bad 193 Rücklauf Bad 190 Boden WC 196 Zimmer WC 195 Rücklauf WC 193 Vorlauf unten 185 Vorlauf Oben 190 Aussen 187 Kessel 188 vFeAuXX B 0 0 0 0 0 0 0 36 Anfang veMZU-- 0 25 Interpreter gestoppt Hier der Code vom Slave Sub main() Dim vData(32) As Byte 'temporäre Daten wird erst gültig wenn die �bertragung verifiziert wurde Dim vFehlerByte1, vFehlerByte2 As Byte 'Fehlerbyte Dim vEmpf As Byte 'ist True wenn sich Zeichen im Empfanspufer befinden Init() Lab Anfang Do While True Y = Serial_ReadExt(0) 'Empfangspuffer leeren If Y = &H100 Then : Exit : End If End While vEmpf = False Do While True Do While True ChackMasterStoerung() 'prüft ob eine Störsignal vom Master kommt Y = Serial_IRQ_Info(0,RS232_FIFO_RECV) 'prüft wie viele Zeichen empfangen wurden If Y < 30 Then 'wenn keine Daten im Empfangspuffer sind TempMessung() 'Temperaturen messen LCD_Anzeige() 'Anzeige aktualisieren AbsDelay(100) Else vEmpf = False Exit 'Empfangspuffer ist gefüllt End If If Y > 0 And vEmpf = False Then 'sind Zeichen im Empfangspuffer vTimer = 0 vEmpf = True End If If vTimer > 200 And vEmpf = True Then 'sind 2 sec vergangen nach dem der Empfangspuffer Date empfangen hat Goto Anfang 'aber nicht vollständig gefüllt wurde End If 'Empfang zurücksetzen End While X = 0 Do While True Y = Serial_ReadExt(0) 'Daten aus Empfangspuffer vData(X) = Y X++ Msg_WriteInt(Y):Msg_WriteText("* ") If Y = &H100 Then 'Ende der Daten Msg_WriteChar(13) Exit 'bei &H100 ist der Empfangspuffer leer End If End While vFehlerByte1 = 0b10101010 vFehlerByte2 = 0b01010101 If vData(0) = 245 And vData(1) = 7 And vData(2) = 248 And vData(3) = 36 And vData(26) = 36 And _ vData(27) = 248 And vData(28) = 7 And vData(29) = 245 Then For X = 0 To 10 Msg_WriteInt(vData(4 + X)):Msg_WriteText("-" ):Msg_WriteInt(vData(15 + X)):Msg_WriteText(" " ) If vData(4 + X) <> vData(15 + X) Then vFehlerByte1 = 0b01010101 'bei Empfangsfehler die Bits wechsel vFehlerByte2 = 0b10101010 Msg_WriteText("Fehler in Empfangsdaten r" ) End If Next Else Msg_WriteText("Fehler Anfang oder Schluss r" ) vFehlerByte1 = 0b01010101 'bei Empfangsfehler die Bits wechsel vFehlerByte2 = 0b10101010 End If Msg_WriteChar(13 ) Msg_WriteText("Daten anwendenr" ) vVentilauswahl = vData(4) 'wenn alles OK Daten auf die Variablen übertragen vVentilPosWo = vData(5) vVentilPosGa = vData(6) vVentilPosBa = vData(7) vVentilPosWC = vData(8) vVentAuswWo = vVentilauswahl And 0b00000001 'die Ventilauswahl aufteilen vVentAuswGa = vVentilauswahl And 0b00000010 vVentAuswBa = vVentilauswahl And 0b00000100 vVentAuswWC = vVentilauswahl And 0b00001000 'Ventile stellen Ventilstufe(vVentAuswWo, vVentAuswGa, vVentAuswBa, vVentAuswWC, vVentilPosWo, vVentilPosGa, vVentilPosBa, vVentilPosWC) Msg_WriteChar(13 ) Msg_WriteText("Data OK " ) Msg_WriteInt(vVentilPosWo) Msg_WriteText(" " ) Msg_WriteInt(vVentilPosGa) Msg_WriteText(" " ) Msg_WriteInt(vVentilPosBa) Msg_WriteText(" " ) Msg_WriteInt(vVentilPosWC) Msg_WriteText("r" ) Serial_Write(0,vFehlerByte1) Serial_Write(0,vFehlerByte2) Serial_Write(0,245) 'Startsequen senden Serial_Write(0,7) Serial_Write(0,248) Serial_Write(0,37) For X = 0 To 26 Serial_Write(0,vMessWerte(X)) Next Serial_Write(0,vVentilPosWo) Serial_Write(0,vVentilPosGa) Serial_Write(0,vVentilPosBa) Serial_Write(0,vVentilPosWC) Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve For X = 0 To 26 Serial_Write(0,vMessWerte(X)) Next Serial_Write(0,vVentilPosWo) Serial_Write(0,vVentilPosGa) Serial_Write(0,vVentilPosBa) Serial_Write(0,vVentilPosWC) Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,0) 'Reserve Serial_Write(0,37) 'Schlusssequenz senden Serial_Write(0,248) Serial_Write(0,7) Serial_Write(0,245) AbsDelay(1000) End While End Sub 6 And vData(30) | |
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum