String empfangen

beim ersten Wert funktioniert es bestens, beim 2 wert wird ein steurzeichen übertragen wo eigentlich keins sein sollte, zwischen der zahl und dem text, hat jemand ne idee warum ? könnte vielleicht jemand mal den code testen ?
vielleicht liegts auch nur am terminal prog
 
Welches Terminalprogramm verwendest Du aktuell?
Hast Du eine Möglichkeit, unabhängig von PC und Deinem Atmega auf der seriellen Schnittstelle mitzutracen um zu sehen was wirklich über die Leitung geht.

Hast Du eine Möglichkeit im Programm auf einer anderen RS232 mal Traceausgaben zu schreiben damit zu selbst ausgeben kannst, an welcher Stelle im Programm was gemacht wird?

Grüße,
Markus
 
also ich könnte einaml via rs232 auf denm uart zugreifen und , dann könnt ih noch den ft232 via usb dranhängen,.

benutze hterm / realterm,.

der 1284 hat doch 2 uarts ?

hier mal was ich zurückbekomme,

sende tu ich sowas wie
1 test
2 test

empfangen tu ich :
Code:
 1.Teil: 1<\r>
<\n> 2.Teil: test1<\r>
<\n> Musikinfo 1 test1<\r>
<\n><\r>
<\n> 1.Teil: <\n>2<\r>
<\n> 2.Teil: test<\r>
<\n><\r>
<\n> Nix sinnvolles angekommen<\r>
<\n>

aus Hterm

hier nochma die empfangsroutine:
Code:
Empfangen:

      Set Led2
      If Udr = 10 Then                                      'eingehender string wird auf zeichen LF geprüft

             Countar = Split(buffer , Teile(1) , " ")
             Buffer = ""
             Print " 1.Teil: " ; Teile(1)
             Print " 2.Teil: " ; Teile(2)
             Select Case Teile(1)
                Case "1":
                         Musik(1) = Teile(2)
                         Print " Musikinfo 1 " ; Musik(1)
                         Print
                 ....
                Case Else:
                Print
                      Print " Nix sinnvolles angekommen"
             End Select

      Else
         If Udr <> 13 Then
            Buffer = Buffer + Chr(udr)                      'an string anfügen

         End If                                             'zeichenzähler um 1 erhöhen
      End If
   Reset Led2
Return
 
so hab jetzt rausgefunden warum es nur beim ersten string funktioniert, hab aber dafür nioch keine lösung gefunden

also, beim prüfen ob der sting zu ende ist mit if udr = x , wird nur überprüft ob das zeichen vorhanden ist...

normaleriwese wird wenn man das UDR ausliest, dessen inhalt gelöscht, und genau das passiert hier nicht,.. d.h. ich müsste in die bedingung logischerweise noch abfall = udr reinschreiben das mein String-Ende prüfzeichen aus meinem register gelöscht wird, sonst steht mein prüfzeichen nach jedem erfolgreich gesendeten string , vor meinem nächsten gesendetetn string, und somit ist er ungültig,.

edit: soweit sdie theorie, funktioniert aber nicht,.
 
Glückwunsch ... nun bist Du ein Stück weiter. Ich war auch gerade dabei mir Deinen Code anzusehen :p Hat sicj damit ja erledigt, also schnell weg :vroam:

Wie machst Du jetzt weiter? Was ist noch offen? Alles gut?

Grüße,
Markus
 
ne das problem ist, es funktioniert nicht richtig, nur beim 1. übertragenen sting, dann steht das trennzeichen im 1.teil meines 2 strings. das ist ja das problem, und ich bekomme es auch nicht weg ?!

an µC gesendet : "1 übertragungstest|"
1.Teil: 1
2.Teil: übertragungstes
Musikinfo1 übertragungstes

an µC gesendet : "2 fehlerversuch|"
1.Teil: |2
2.Teil: fehlerversuc
Nix sinnvolles angekommen

hier beim 2ten string sieht man das | vor der zahl, welches ich eigentlich nicht gesendet habe,.
ausserdem sieht man das der letzte buchstabe des 2teils abgeschnitten wurde,.
 
Hallo Bonze,

so ein ähnliches Prob hatte ich auch schon mal mit hterm als ich zum testen Daten an meine Zeitschaltuhr senden wollte. Dann habe ich die Daten der RS232 mal mit "HHD Free Serial Port Monitor" untersucht und da ist mir aufgefallen, das da LF bzw. CR ohne für mich wahrnehmbar übertragen wurden.
Habe dann mit einem schnell geschriebenen Vb.net Programm Daten an meine Zeitschaltuhr gesendet und siehe da, der Empfang ging dann wie gewollt.

Gruß Jörg

PS: Kann ich dir mal geben wenn Du möchtest ;)
 
ja das würde ich ja noch akzeptieren, allerdings hab ich jetzt 3 termianl progs ausprobiert und alle zeigen den selben fehler,. bin auch dabei mit vb.net ein prog dazu zu schreiben
 
Hallo,

Mal schön wieder einen vb.net :adore: begeisterten zu finden.

Ich würde es zuerst mal mit dem "HHD Free Serial Port Monitor" versuchen und damit deine gesendeten Daten anzuschauen, da bekommt man alle Daten inklusive Steuerzeichen in hex angezeigt.

Gruß Jörg, der gespannt ist wo dein Prob her kommt
 
Hallo Bonze,

hänge mal bitte das komplette compilierbare BAS-File an diesen Thread an, ich will mir mal in Ruhe Deinen Code ansehen.

Grüße,
Markus
 
Hallo Bonze,

habe mir Deinen Code mal durchgesehen und muss sagen .... hmmmmm .... Du hast einen seltsamen Ansatz zur Lösung Deines Problems gewählt.

Alsoooo....

Zunächst ist mir aufgefallen, dass Du direkt auf dem UDR Register arbeitest. Hmmm, ich bin mir nicht sicher aber ein bisschen komisch kommt mir das schon vor.

Alsooooo.....

Wenn man auf dem UDR Register arbeitet so kannst Du das schon machen aber nicht auf die Weise wie Du es implementiert hast. Bin ich jedenfalls der Meinung, weil:
Wenn Du über UART ein Zeichen empfängst dann solltest Du zumindest das RXC (ReceiveComplete-Bit auswerten ob überhaupt ein Zeichen angekommen ist. Wenn dieses RXC Bit auf 1 gesetzt ist, wurde ein Zeichen vollständig empfangen und kann aus dem UartDataRegister UDR ausgelesen werden. Sobald das Byte aus dem UDR-Register ausgelesen wurde, setzt der AVR das RXC-Bit automatisch auf 0 zurück, damit wird ein doppeltes Auslesen eines Zeichens verhindert.
So wie ich das in Deinem Programm sehe ist es reiner zeitlicher Zufall, was überhaupt dabei raus kommt. So verstehe ich es jedenfalls und ich verstehe ehrlich gesagt nicht, warum es überhaupt soweit funktionieren konnte.
Die Werte des UDR werden in Deinem Code automatisch überschrieben und daraus leitest Du Deine String ab.

Ich bin fest der Meinung, dass Du so nicht glücklich werden kannst.

Dann noch was. Du prüfst zwar auf den Strich | aber "überlesen" bzw. verworfen wird er nirgends. Damit taucht er auch als Trennzeichen in Deinem nächsten "Absatz" wieder auf. Du musst dafür sorgen, dass nicht nur LF überlesen wird sondern auch der Strich welcher ja immer noch im UDR drin steht.


Was würde ich an Deiner Stelle tun:
1. Ich würde mir eine Trace-Möglichkeit suchen um auf dem RS232 mitzusniffen um die Sicherheit und Gewissheit zu haben was wirklich über die Leitung geht
2. Damit Dein Controller vom PC entkoppelt ist würde ich mir den UART so konfigurieren, dass er im Modus buffered arbeitet. Damit gehen Dir auch keien Zeichen verloren und Du kannst Dir Zeit beim Bearbeiten Deiner String lassen


3. Ich würde die BASCOM eigenen Bordmittel verwenden. Bitte schau Dir dazu die Funktionen
ISCHARWAITING(), WAITKEY(), INKEY()​
mal in BASCOM an.

Hier noch eine Hilfestellung zum Thema buffered:

'first compile and run this program with the line below remarked
Config Serialin = Buffered , Size = 20


Was meinst Du .... ? Ich glaube auf dem Weg kommst Du weiter .... oder Du baust Deinen Code wirklich auf Lowlevel um, aber das solltest Du dann richtig machen:



CodeBox BASCOM

Do
If USR.RXC = 1 Then 'Wenn Byte empfangen...
i = UDR 'Byte aus UART auslesen
' bla bla bla
End If
Loop


Grüße,
markus
 
ok, werd mal da ansetzen und schauen was dabei rauskommt,.

aber nebenbei, ich benutze eigentlich nen Interrupt, um meine empfangsfunktion aufzurufen,.

so mal schnell umgestrickt, und scheint auch zu funkionieren :)
sieht zwar en bisschen wild aus ...
event noch die namen ändern,
Code:
Empfangen:
   If Ischarwaiting() = 1 Then
      Set Led2
      Abfall = Waitkey()
         If Abfall <> "|" Then
            Buffer = Buffer + Abfall
         Else                                 
             Countar = Split(buffer , Teile(1) , " ")
             Buffer = ""                                    'buffer leeren
             Print " 1.Teil: " ; Teile(1)
             Print " 2.Teil: " ; Teile(2)
             Select Case Teile(1)
                Case "1":
                         Musik(1) = Teile(2)
                         Print " Musikinfo1 " ; Musik(1)
                Case "2":
                         Musik(2) = Teile(2)
                         Print " Musikinfo2 " ; Musik(2)
                Case "3":
                         Musik(3) = Teile(2)
                         Print " Musikinfo3 " ; Musik(3)
                Case "4":
                         Musik(4) = Teile(2)
                         Print " Musikinfo4 " ; Musik(4)
                Case "5":
                         Musik(5) = Teile(2)
                         Print " Musikinfo5 " ; Musik(5)
                Case Else:
                         Print " Nix sinnvolles angekommen"
             End Select 
            End If
      End If
   Reset Led2
Return
 
wenn ich jetzt sowas zum Mikrocontroller sende,
HTML:
1;test LF
2;test2 LF
3;test3 LF
4;test4 LF
5;test5 LF

wird nur das erste übernomen;
sende ich aber jetzt zeile für zeile über ein terminalprog dann wird es korrekt übernommen,
die übertragenene zeichen sind in beiden fällen die gleichen!

kanns sein das der mikrocontrollermit der datenmenge nicht klarkommt? hab immoment keinen buffer aktiviert
Code:
Empfangen:
   If Ischarwaiting() = 1 Then                              'prüft ob was empfangen wurde
      Set Led2                                              'led während empfang einschalten
      Abfall = Waitkey()                                    'empfangenes byte in abfall speichern
         If Abfall <> Chr(10) Then                          'inhalt von abfall prüfen
            Buffer = Buffer + Abfall                        'zeichen addieren
         Else
             Countar = Split(buffer , Teile(1) , ";")       'empfanges wird zerlegt
             Buffer = ""                                    'buffer leeren
             Print " 1.Teil: " ; Teile(1)
             Print " 2.Teil: " ; Teile(2)
             Select Case Teile(1)
                Case "1":
                         Musik(1) = Teile(2)
                         Print "Artist: " ; Musik(1)
                Case "2":
                         Musik(2) = Teile(2)
                         Print "Titel: " ; Musik(2)
                Case "3":
                         Musik(3) = Teile(2) + "kb/s"
                         Print " Musikinfo3 " ; Musik(3)
                Case "4":
                         Musik(4) = Teile(2)
                         Print " Musikinfo4 " ; Musik(4)
                Case "5":
                         Musik(5) = Teile(2)
                         Print " Musikinfo5 " ; Musik(5)
                Case Else:
                         Print " Nix sinnvolles angekommen"
             End Select
              Print "_________________________________________"
            End If
      End If
   Reset Led2
Return
 
so hab jetzt nen code der rel gut funktioniert,
jedoch bleibt mir eins rätselhaft,
via terminal funktioniert der code 1 a
, mit meinem selbstgeschriebenen programm jedoch fast nicht, es wird immer nur der erste datensatz angezeigt
Code:
Dim Seingang As String * 50 , S As String * 1 , Musik(5) As String * 50
Dim Elaenge As Byte , B As Byte
Enable Urxc
On Urxc Empfangen
Enable Interrupts
'Config Serialin = Buffered , Size = 50


'_______________________________________________________________________________
Print "Version: " ; Version(1)
Call Lcd_init()                                             'lcd initialisieren
Call Lcd_clear(black)                                       'lcd schwarz färben
Call Lcd_reset_window(0 , 240 , 0 , 90)                     'lcd größe bzw beschreibbare größeandern
Do


 'Delscroll = Xyz - 2                                        'schrift 12x16
     '  Xyz = Xyz + 1
     '  Yzx = Yzx - 1


   Call Lcdtext(musik(1) , 0 , 0 , 5 , Red , Black )
 'Call Draw_box(delscroll , Xyz , 0 , 20 , Black)
   Call Lcdtext(musik(2) , 0 , 20 , 5 , Red , Black )
 'Call Draw_box(delscroll , Xyz , 0 , 20 , Black)
   Call Lcdtext(musik(3) , 0 , 40 , 5 , Red , Black )
 'Call Draw_box(delscroll , Xyz , 0 , 20 , Black)
   Call Lcdtext(musik(4) , 0 , 60 , 5 , Red , Black )
 'Call Draw_box(delscroll , Xyz , 0 , 20 , Black)
   Call Lcdtext(musik(5) , 0 , 80 , 5 , Red , Black )
 'Call Draw_box(delscroll , Xyz , 0 , 20 , Black)

Loop
End
'_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Empfangen:
Set Led2
   B = Inkey()
   If B >= 13 Then
         If B = 13 Then                                     'prüft auf zeichen Cr
            Gosub Auswerten
         Else
            If Len(seingang) < 50 Then                      'seingang = eingangsstring
               Seingang = Seingang + Chr(b)
            Else
               Seingang = ""
            End If
         End If
   End If
   Reset Led2

Return

Auswerten:

   S = Left(seingang , 1)                                   ' schneidet das erste zeichen von links ab
   B = Val(s)
   Elaenge = Len(seingang)
   Elaenge = Elaenge - 1
              Select Case S
                Case "1":
                         Musik(1) = Mid(seingang , 2 , Elaenge)
                         Print "Artist: " ; Musik(1)
                Case "2":
                         Musik(2) = Mid(seingang , 2 , Elaenge)
                         Print "Titel: " ; Musik(2)
                Case "3":
                         Musik(3) = Mid(seingang , 2 , Elaenge) + "kb/s"
                         Print " Musikinfo3 " ; Musik(3)
                Case "4":
                         Musik(4) = Mid(seingang , 2 , Elaenge)
                         Print " Musikinfo4 " ; Musik(4)
                Case "5":
                         Musik(5) = Mid(seingang , 2 , Elaenge)
                         Print " Musikinfo5 " ; Musik(5)
                Case Else:
                         Print " Nix sinnvolles angekommen"
             End Select
             Call Lcd_clear(black)
             Print "Artist " ; Musik(1)
             Print "Titel " ; Musik(2)
             Print "Bitrate " ; Musik(3)
             Print "Artist " ; Musik(4)
             Print "Artist " ; Musik(5)
              Print "_________________________________________"
   Seingang = ""

Return
 
Hallo Bonze,

also wenn Du mich fragst dann wirst Du dieses Mysterium erst lösen können, wenn Du Dir die Signale auf der RS232-Leitung wirklich ansiehst. Irgend einen Unterschied wird es geben der sich uns aus der Ferne aber nicht erschließt.

Hast Du anstelle Deines Megas mal einen anderen PC angehängt und mit einem Terminalprogramm auf Byteebene angeschaut und verglichen was wirklich gesendet wird.

Grüße,
Markus
 
also, mein prog war richtig, pc sowie avr seite, jedoch sollte man bedenken das man den uart buffert! , sonst gehen die bytes verloren,.
irgendwie wird man aus der doku darüber aber nicht so recht schlau,.
habs gemacht, und nun hat es alles schön sauber, mit annehmbarer geschwindigkeit angezeigt,
hab mit dem HD Free serial Port Monitor den "traffic" beobachtet,.
 
vielleicht interssiert es ja den ein oder anderen , hier das AVR programm!
Code:
'##################
Dim Seingang As String * 100 , S As String * 1 , Musik(5) As String * 50
Dim Elaenge As Byte , B As Byte

[B]Config Serialin = Buffered , Size = 50
Enable Interrupts[/B]


'_______________________________________________________________________________
Print "Version: " ; Version(1)
Call Lcd_init()                                             'lcd initialisieren
Call Lcd_clear(black)                                       'lcd schwarz färben
Call Lcd_reset_window(0 , 240 , 0 , 100)                    'lcd größe bzw beschreibbare größeandern
Do
Set Led1
 If Ischarwaiting() = 1 Then
        Gosub Empfangen
   End If
Reset Led1
Loop
End
'_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Empfangen:

Set Led2
If Ischarwaiting() = 1 Then                                 'falls zeichen im eingangspuffer liegt
   B = Inkey()                                              'holt zeichen aus Uart Puffer
   'If B >= 13 Then                                          'wenn zeichen schriftzeichen  ist
         If B = 13 Then                                     'falls zeichn 13 vorkommt prüft auf zeichen LF| 13= Cr
            Gosub Auswerten                                 '  gehe zu sub auswerten
         Else                                               'ansonsten
            If Len(seingang) < 100 Then                     '  wenn eingangsstring weniger wie 50 zeichen hat
               Seingang = Seingang + Chr(b)                 '     füge zeichen dem string hinzu
            Else                                            '  ansonsten
               Seingang = Seingang                          '     empfange nur die ersten 50 zeichen
            End If
         End If
   'End If
   Reset Led2
End If
Return


Auswerten:

   S = Left(seingang , 1)                                   'schneidet das erste zeichen von links ab
   Elaenge = Len(seingang)
   Elaenge = Elaenge - 1                                    'enthält die gesamtlänge des strings -1
              Select Case S
                Case "1":
                         Call Draw_box(0 , 240 , 0 , 20 , Black)
                         Musik(1) = Mid(seingang , 2 , Elaenge)
                         Call Lcdtext(musik(1) , 0 , 0 , 5 , Red , Black )
                         Print "Artist: " ; Musik(1)

                Case "2":
                         Call Draw_box(0 , 240 , 20 , 40 , Black)
                         Musik(2) = Mid(seingang , 2 , Elaenge)
                         Call Lcdtext(musik(2) , 0 , 20 , 5 , Red , Black )
                         Print "Titel: " ; Musik(2)
                Case "3":
                         Call Draw_box(0 , 240 , 40 , 60 , Black)
                         Musik(3) = Mid(seingang , 2 , Elaenge)
                         Call Lcdtext(musik(3) , 0 , 40 , 5 , Red , Black )
                         Print " Musikinfo3 " ; Musik(3)
                Case "4":
                         Call Draw_box(0 , 240 , 60 , 80 , Black)
                         Musik(4) = Mid(seingang , 2 , Elaenge)
                         Call Lcdtext(musik(4) , 0 , 60 , 5 , Red , Black )
                         Print " Musikinfo4 " ; Musik(4)
                Case "5":
                         Call Draw_box(0 , 240 , 80 , 100 , Black)
                         Musik(5) = Mid(seingang , 2 , Elaenge)
                         Call Lcdtext(musik(5) , 0 , 80 , 5 , Red , Black )
                         Print " Musikinfo5 " ; Musik(5)
                Case Else:
                         Print " Nix sinnvolles angekommen"
             End Select
   
   Seingang = ""

Return
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)