Hallo
Ich habe da wieder einmal ein eigenartiges Problem.
Dazu habe ich ein zusammengestrichenes Programm erstellt was den "Fehler" auch produziert.
Und zwar ergibt sich folgendes Problem:
Die Hardware ist über einen USB-RS485-Dongle mit dem PC verbunden auf dem ein Terminalprogramm läuft.
Die rote LED blinkt dauernd im Sekundentakt (durch den IRQ.
Es kommt zu einer Datenübertragung (der PC sendet die Zeichenkette BASCOMTEST gefolgt von einem CR.
Die Hardware empfängt diese korrekt und erkennt die Datenübertragung mittels IsCharWaiting auch korrekt.
Abhängig vom Zustand der Key_Defaulttaste KEY_Default-Taste wird entweder mittel grüner LED in Anzahl der empfangenen Zeichen geblinkt oder die Zeichenkette entsprechend zurückgegeben.
Das Problem besteht allerdings darin, dass durch den Print-Befehl aus einem mir unbekannten Grund IsCharWaiting der Meinung ist, da sind neue Zeichen, welche aber nicht abgeholt werden können.
Das Programm hängt dann sogar in einer Schleife wie man am abgebrochenen Ausgabeergebnis erkennen kann (IsCharWaiting wird wohl nach dem Print wieder 1 es sind aber keine (auch nicht druckbare) Zeichen vorhanden. Inkey liefert jedenfalls immer nur 0, Waitkey wartet an der Stelle übrigens ewig auf ein Zeichen also gehe ich mal davon aus, dass da auch nichts ist).
Wird der Print-Befehl allerdings nicht verwendet und der Empfangsstatus nur durch die LED signalisiert wird der Bereich auch nur jeweils beim Datenempfang durchlaufen. Dies erkennt man am Signal welches dann tatsächlich nur nach jeder empfangenen Zeile signalisiert.
Ich denke, dass da ein Problem mit dem RS485 (MAX485 im Halbdublex und dessen Umschaltung) vorliegen könnte, jedenfalls habe ich in der Vergangenheit nichts derartiges beobachtet
Irgendwie stehe ich vor einem Rätsel, kann das eventuell wer lösen?
Alles anzeigen
Ich habe da wieder einmal ein eigenartiges Problem.
Dazu habe ich ein zusammengestrichenes Programm erstellt was den "Fehler" auch produziert.
Und zwar ergibt sich folgendes Problem:
Die Hardware ist über einen USB-RS485-Dongle mit dem PC verbunden auf dem ein Terminalprogramm läuft.
Die rote LED blinkt dauernd im Sekundentakt (durch den IRQ.
Es kommt zu einer Datenübertragung (der PC sendet die Zeichenkette BASCOMTEST gefolgt von einem CR.
Die Hardware empfängt diese korrekt und erkennt die Datenübertragung mittels IsCharWaiting auch korrekt.
Abhängig vom Zustand der Key_Defaulttaste KEY_Default-Taste wird entweder mittel grüner LED in Anzahl der empfangenen Zeichen geblinkt oder die Zeichenkette entsprechend zurückgegeben.
Das Problem besteht allerdings darin, dass durch den Print-Befehl aus einem mir unbekannten Grund IsCharWaiting der Meinung ist, da sind neue Zeichen, welche aber nicht abgeholt werden können.
Das Programm hängt dann sogar in einer Schleife wie man am abgebrochenen Ausgabeergebnis erkennen kann (IsCharWaiting wird wohl nach dem Print wieder 1 es sind aber keine (auch nicht druckbare) Zeichen vorhanden. Inkey liefert jedenfalls immer nur 0, Waitkey wartet an der Stelle übrigens ewig auf ein Zeichen also gehe ich mal davon aus, dass da auch nichts ist).
Wird der Print-Befehl allerdings nicht verwendet und der Empfangsstatus nur durch die LED signalisiert wird der Bereich auch nur jeweils beim Datenempfang durchlaufen. Dies erkennt man am Signal welches dann tatsächlich nur nach jeder empfangenen Zeile signalisiert.
Ich denke, dass da ein Problem mit dem RS485 (MAX485 im Halbdublex und dessen Umschaltung) vorliegen könnte, jedenfalls habe ich in der Vergangenheit nichts derartiges beobachtet
Irgendwie stehe ich vor einem Rätsel, kann das eventuell wer lösen?
BASCOM-Quellcode
- $regfile = "m328pdef.dat"
- $crystal = 11059200
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- Config Submode = New
- Config Base = 0
- Config Adc = Single , Prescaler = Auto , Reference = AVCC
- Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
- Config Print0 = PortD.2 , Mode = Set
- Config Pind.2 = Output
- Config Input1 = Cr , Echo = Cr
- Config SERIALIN0 = BUFFERED , SIZE = 200
- Echo Off
- $baud = 9600
- '(
- ##############################################################################
- #
- # Timerkonfiguration und Konstanten für Timer-IRQ mit 10 ms
- #
- ##############################################################################
- ')
- Config TIMER0 = Timer , Prescale = 1024
- Const TimerPreload = 148
- On Timer0 Timer_IRQ
- Dim A As Byte
- Dim X As Byte
- Dim Y As Byte
- Dim Z As Byte
- Dim V As Word
- Dim W As Word
- Dim sAdresse As String * 1
- Dim sCMD As String * 16
- Dim sCommand As String * 2
- Dim sParameter As String * 16
- Dim ResultText As String * 128
- Dim iTimer As Word
- Dim iFlash As Byte
- Config PORTB.0 = Input ' MP3 Busy
- Config PORTC.3 = Input ' Adresse 1
- Config PORTC.4 = Input ' Adresse 0
- Config PORTD.3 = Input ' Key Quit
- Config PORTD.4 = Input ' Key Set
- Config PORTD.6 = Input ' Reserve
- Config PORTD.7 = Input ' Key_Default
- Config PORTC.0 = Output ' Output 1
- Config PORTC.1 = Output ' Output 2
- Config PORTC.2 = Output ' Output 3
- Config PORTD.5 = Output ' Signal
- Config PORTB.3 = Output ' Status RT
- Config PORTB.4 = Output ' Status GN
- Config PORTB.5 = Output ' Status BL
- ' Pollup aktivieren
- Set Portb.0
- Set PortC.3
- Set PortC.4
- Set PortD.3
- Set PortD.4
- Set PortD.6
- Set PortD.7
- Status_rt Alias PORTB.3
- Status_gn Alias PORTB.4
- Status_bl Alias PORTB.5
- Output1 Alias PORTC.0
- Output2 Alias PORTC.1
- Output3 Alias PORTC.2
- Signal Alias PORTD.5
- MP3busy Alias PINB.0
- BoxAdr0 Alias PINC.3
- BoxAdr1 Alias PINC.4
- Key_Reserve Alias PinD.6
- Key_Default Alias PinD.7
- Key_Quit Alias PIND.3
- Key_Set Alias PIND.4
- MP3IsOn Alias PIND.6
- Enable TIMER0
- Enable Interrupts
- TIMER0 = TimerPreload
- Do
- If IsCharWaiting() = 1 Then
- Set Signal ' Buzzer On
- X = 0
- sCMD = ""
- sAdresse = ""
- sCommand = ""
- sParameter = ""
- iTimer = 25
- Do
- A = Inkey()
- If A > 30 Then
- sCMD = sCMD + Chr(A)
- Incr X
- If X > 31 Then
- iTimer = 0
- End If
- ElseIf A > 0 Then
- If sCmd = "" And A = 13 Then
- sCMD = sCMD + ">13!"
- ElseIf A <> 13 Then
- sCMD = sCMD + ">" + Str(A)
- End If
- End If
- Loop Until iTimer = 0 Or A = 13
- sCMD = Ucase(sCMD)
- If iTimer <> 0 And A = 13 Then
- If Key_Default = 0 Then ' Default-Taste betätigt
- Reset Signal
- Y = Len(sCMD)
- If Y = 0 Then
- Set Status_bl
- Waitms 1000
- Reset Status_bl
- Else
- For X = 1 To Y
- Set Status_gn
- Waitms 200
- Reset Status_gn
- Waitms 200
- Next
- End If
- Else ' Default-Taste nicht betätigt
- Print "CMD:[" ; sCMD ; "]"
- End If
- Else
- Print "ERR:[" ; sCMD ; "]"
- End If
- Waitms 50
- Reset Signal ' Buzzer Off
- Waitms 50
- End If
- Loop
- End
- Timer_IRQ:
- TIMER0 = TimerPreload
- Select Case iFlash
- Case 0
- Set Status_rt
- Case 50
- Reset Status_rt
- Case Is > 99
- iFlash = 255
- End Select
- Incr iFlash
- If iTimer <> 0 Then
- Decr iTimer
- End If
- Return