[Gelöst] RS232, Rückgabe NULL abfangen

Fragen zu Raspberry, FritzBox, Microcontroller, UART, etc...
Antworten
DK7IH
Foriker
Beiträge: 5
Registriert: Mi 25. Nov 2020, 09:37
Kontaktdaten:

[Gelöst] RS232, Rückgabe NULL abfangen

Beitrag von DK7IH » Mo 30. Nov 2020, 09:52

Hallo zusammen!

Ich programmiere gerade eine Kommunikationssoftware zwischen einem Gambas-Client unter Linux Mint 18 und einem ATmega128. Ich möchte damit eines meiner selbstgebauten Amateurfunkgeräte steuern (Projektbeschreibung). Die Kommunikation mit der seriellen Schnittstelle funktioniert soweit, ich kann Daten an das Funkgerät senden und von ihm empfangen. Grundsätzlich zumindest. Denn der Empfang über RS232 macht sporadisch Probleme. Ich erhalte teilweise einen NULL-Zeiger von der Funktion zurück, welche Daten vom angeschlossenen COM-Device ( comRS232.PortName = "/dev/ttyUSB0") erhält. Vor dem Lesen aus der Schnittstelle wird dem Funkgerät mitgeteilt, welche Daten man erhalten will.

Hier die Empfangsfunktion:
gambas code
Function GetTRXData(strRequest As String) As String

    Dim strRX As String
     
    TransmitData(strRequest & " " & gb.Cr) 'Anforderung der Daten aus dem Transceiver
     
    comRS232.Begin()
    comRS232.Drop
    Sleep 0.025
    Read #comRS232, strRx, Lof(comRS232)
        
    If Error Then
         Return "-1"
    Endif

    If Len(strRx) > 1 Then
         Return strRX
    End If
    
    Return "-1"
End
Der String, der zurückkommt enthält dann idealerweise den Puffer der RS232-Schnittstelle. Manchmal kommt aber NULL zurück, was ich mir nicht erklären kann, denn ich gebe entweder die Variable zurück oder eine Konstante (-1). Den NULL-Pointer versuche ich dann abzufangen in der aufrufenden Funktion. Diese lädt (derzeit noch manuell) Daten, nachdem die Schnittstelle geöffnet wurde:
gambas code
Public Sub cmdLoadData_Click()
   Dim intRval As Integer
   Dim strRval As String
    
   strRVal = GetTRXData("GET BAND")
   'Print strRVal
   If IsNull(strRVAl) = False Then 
       intRVal = Val(strRVal)
       If intRVal >= 0 And intRVal <= 5
          'Print intRVal
           cmbBand.Index = intRVal
           cmbBand.Refresh
       Endif    
   Endif
End
In der 6. Zeile frage ich auf IsNull() ab, trotzdem bringt die nächste Zeile, wo mit Val() eine Typumwandlung durchgeführt werden soll, den Fehler, dass dort ein NULL angekommen ist.
gambas_dk7ih_1.png
gambas_dk7ih_1.png (48.09 KiB) 8912 mal betrachtet
Wie kann das sein?

Viele Grüße

Peter
Zuletzt geändert von DK7IH am Mo 30. Nov 2020, 13:08, insgesamt 2-mal geändert.

Benutzeravatar
tionov
Site Admin
Beiträge: 540
Registriert: So 18. Mai 2014, 23:40
Kontaktdaten:

Re: RS232, Rückgabe NULL abfangen

Beitrag von tionov » Mo 30. Nov 2020, 11:33

Hi Peter,

was steht denn in diesem Fall in strRVal? Mach doch mal einen Fehlerbehandlung mit Catch und dort 'Print strRVal':
gambas code
' .... Code
Catch
     Print "Fehler: strRVal enthält'" & strRVal & "'"
Alles Gute,

tionov

DK7IH
Foriker
Beiträge: 5
Registriert: Mi 25. Nov 2020, 09:37
Kontaktdaten:

[Gelöst] Re: RS232, Rückgabe NULL abfangen

Beitrag von DK7IH » Mo 30. Nov 2020, 13:07

Hi tionov,

vielen Dank für's Antworten. Ich konnte das Problem lösen. Es muss eine kurze Wartezeit zwischen der Übermittlung des Befehls an das Funkgerät und dem Abfragen der Empfangsdaten liegen. So geht das nun:
gambas code
Function GetTRXData(strRequest As String) As String

    Dim strRX As String
     
    TransmitData(strRequest & " " & gb.Cr)
    Wait 0.01 'NEU!!!!
     
    comRS232.Begin()
    comRS232.Drop
    Sleep 0.025
    Read #comRS232, strRx, Lof(comRS232)
        
    If Error Then
         Return "-1"
    Endif

    If Len(strRx) > 1 Then
         Return strRX
    End If
    
    Return "-1"
End

Viele Grüße

Peter

Benutzeravatar
tionov
Site Admin
Beiträge: 540
Registriert: So 18. Mai 2014, 23:40
Kontaktdaten:

Re: [Gelöst] RS232, Rückgabe NULL abfangen

Beitrag von tionov » Mo 30. Nov 2020, 13:30

Ok.
Alles Gute,

tionov

DK7IH
Foriker
Beiträge: 5
Registriert: Mi 25. Nov 2020, 09:37
Kontaktdaten:

Re: [Gelöst] RS232, Rückgabe NULL abfangen

Beitrag von DK7IH » Mo 30. Nov 2020, 13:48

Hi, ich nochmal,

also, die Schnittstelle scheint ein ganz ordentliches Timingproblem zu haben. Wenn ich eine zweite Befehlssequenz sofort nach der ersten übermittele geht das Problem von vorne los. Außerdem werden die rückübermittelten Datenstrings abgeschnitten. Man muss dann zwischen die beiden Befehls-Sequenzen, welche die Daten an den RS232-Port senden, wiederum ca. 50ms Delay einbauen, damit es nicht zum Absturz kommt. Und dann reduziert sich auch die Datenfehlerrate auf 0.

Edit: Was das aber alles mit dem angeblichen NULL-Pointer zu tun hat, verstehe ich immer noch nicht. Sehr spannend. ;-)

Viele Grüße

Peter

Benutzeravatar
tionov
Site Admin
Beiträge: 540
Registriert: So 18. Mai 2014, 23:40
Kontaktdaten:

Re: [Gelöst] RS232, Rückgabe NULL abfangen

Beitrag von tionov » Mo 30. Nov 2020, 14:10

Ich kenne mich mit RS232 nicht aus. Aber du solltest mal schauen, wo du 'Wait' (ohne Zeitangabe) anwenden kannst. Damit sagst du nämlich Gambas, es soll warten, bis ein Event abgeschlossen ist. Weil vielleicht ist dein Code auf deinem Computer schneller als die Schnittstelle.

Hier kannst du auch die englische Mailingliste durchsuchen, z.B.:

https://lists.gambas-basic.org/cgi-bin/ ... rs232+wait
Alles Gute,

tionov

DK7IH
Foriker
Beiträge: 5
Registriert: Mi 25. Nov 2020, 09:37
Kontaktdaten:

Re: [Gelöst] RS232, Rückgabe NULL abfangen

Beitrag von DK7IH » Mo 30. Nov 2020, 16:29

Hallo,

ja Du scheinst Recht zu haben. Der Fehler tritt auf, wenn die Schnittstelle nicht oder nicht rechtzeitig antwortet. Vielen Dank für den Link, da werde ich mal reinsehen. Aber zumindest kann ich das Problem jetzt eingrenzen.

Schöne Grüße

Peter

Crabman
Foriker
Beiträge: 199
Registriert: So 6. Jan 2019, 13:31
Kontaktdaten:

Re: [Gelöst] RS232, Rückgabe NULL abfangen

Beitrag von Crabman » Do 29. Apr 2021, 09:12

Moin

Der Beitrag ist zwar schon etwas betagt aber vielleicht erreicht Dich meine Antwort noch.

Ich arbeite seit langem erfolgreich mit seriellen Schnittstellen und es werden ihnen z.T. Probleme unterstellt, die sich in aller Regel als Programmierfehler herausstellen. Mein letztes großes Programm für die Fernsteuerung eines HF-Transceivers per RS232 habe ich mit Gambas geschrieben und es funktioniert 1A.
Wichtig ist zu erkennen, dass die Gambas-RS232-Klasse volle Duplex-Fähigkeit hat, was nicht unbedingt bei den zu steuernden Funkgeräten der Fall ist. Während mein letzter HF-Transceiver beispielsweise volle RS232-Duplex-Fähigkeit besaß, war das bei einem älteren Receiver nicht der Fall. Bei Geräten die keine RS232-Duplex-Fähigkeit besitzen (was primär von der Firmware des Gerätes abhängt), kann es beispielsweise passieren, dass man ihm ein Kommando schickt, während es gerade etwas zurück meldet. Das Kommando geht also verloren. Die Programme müssen also u.U. für die zu steuernden Geräte ausgelegt werden und es kann beispielsweise erforderlich sein, dass man in einer Art "Handshake-Betrieb" auf eine Antwort warten muss, bevor man ein weiteres Kommando raus schickt. Ich nenne das mal "Synchronbetrieb". Bei Funkgeräten, deren serieller Schnittstelle duplex-fähig sind, kann man i.d.R. (aber auch nicht immer) auf "Rücksicht" verzichten und "asynchron" steuern, also zu beliebigen Momenten Befehle schicken und Rückmeldungen empfangen.

Vielleicht betrachtest Du Dir Dein Problem mal aus dieser Perspektive. Bei ca. 6 Programmen, die ich zur Fernsteuerung von Funkgeräten geschrieben habe, war das immer das Hauptproblem.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste