mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Binärübertragung - minicom dran schuld?


Autor: Günther Frings (taraquedo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe eine serielle Konsole als Befehlskonsole gestaltet. Die 
funktioniert prima. Es müssen jedoch auch binäre Daten zum Atmel 
übertragen werden. Dazu entwarf ich ein Kommando, welches auf diese 
binären Daten wartet. Die Schnittstelle arbeitet mit 9600 Baud, 8N1 
(Takt ist extern).

Nun schreibe ich in minicom das Kommando und drücke CTRL+A Y zum "Paste 
file". Wähle eine nur 57 Byte Textdatei aus. Diese wird nicht 
vollständig übertragen. Mitten drin fehlen mal ein paar Byte. Dadurch 
wartet dann der Atmel immernoch auf Eingaben, minicom ist aber schon 
fertig.

Was mache ich falsch? Stimmt irgendein Timing nicht?

Hier mal ein Auszug aus dem Code, um mal zu veranschaulichen, was ich 
meine:
for (uint32_t i=0; i<length; i++)
{
     if (i%16 == 0)
     {
          // Adressen alle 16Byte anzeigen
          uart_puts_p(PSTR("\n"));
          uart_putdw_hex(i);
          uart_puts_p(PSTR(":  "));
     }
     // Zeichen einlesen
     uint8_t c = uart_getc();
     // Ausgeben, wenn druckbar
     if (c > 0x1F && c < 0x7F)
          uart_putc(c);
     else
          uart_putc('.');
     // TODO: Mit den Daten was machen
}

Grüße!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was mache ich falsch? Stimmt irgendein Timing nicht?

Ich wette du hast kein Handshaking implementiert.
Dadurch 'überrent' der Sender den Empfänger.

Autor: Günther Frings (taraquedo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Ich wette du hast kein Handshaking implementiert.

Wette gewonnen.

Also werde ich wohl XON/XOFF implementieren müssen. Da stellt sich mir 
jetzt die Frage, welchen ASCII-Code hat XON bzw. XOFF und wie übertrage 
ich diese ASCII-Zeichen dann, wenn diese damit belegt sind? Dafür muss 
es doch schon einen Standard geben, den minicom und alle anderen 
Terminals nutzen. Wie heißt der und wo kann ich den nachschlagen?

Grüße und vielen Dank!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Günther Frings wrote:
> Karl heinz Buchegger wrote:
>> Ich wette du hast kein Handshaking implementiert.
>
> Wette gewonnen.
>
> Also werde ich wohl XON/XOFF implementieren müssen. Da stellt sich mir
> jetzt die Frage, welchen ASCII-Code hat XON bzw. XOFF

XON   17 = 0x11   (Ctrl-Q)
XOFF  19 = 0x13   (Ctrl-S)

Siehe eine ASCII tabelle deiner Wahl, zb.
http://www.tcp-ip-info.de/tcp_ip_und_internet/ascii.htm

> und wie übertrage
> ich diese ASCII-Zeichen dann, wenn diese damit belegt sind?

Gar nicht.
XON/XOFF ist keine gute Wahl, wenn
* du einen der Kommunikationspartner nicht verändern kannst.
* du unbedingt eine Binäre Übertragung brauchst

> Dafür muss > es doch schon einen Standard geben, den minicom
> und alle anderen Terminals nutzen. Wie heißt der und wo kann
> ich den nachschlagen?

Manchmal können Terminalemulationen Dinge wie 'Kermit' oder
'X-Modem' oder 'Z-Modem'. Das sind einfach nur Protokolle wie
eine Binärdatei über eine 'Text-Leitung' übertragen werden soll.


Wenns den unbedingt binäre Übertragung sein soll, ist das Einfachste
du rüstest ein RTS/CTS Hardware-Handshake nach.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry:
Mit XModem kannst du keine Binärdaten bei XON/XOFF Handshake
übertragen. Die anderen beiden Protokolle müssten das können.

Autor: Florian Haskamp (trapperjohn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank Google bin ich zufällig über dieses alte Thema gestolpert, da ich 
das gleiche "Problem" habe. Es scheint aber nicht am "Überrennen" des 
Empfängers zu liegen, sondern daran, dass Minicom eine 0 (also binär, 
nicht das ASCII Zeichen) als Ende der Übertragung ansieht.

Gibt es eine Möglichkeit, mit Minicom kleine Binärdateien 1:1 zu 
übertragen, ohne dass die Software sich für die gesendeten Daten 
"interessiert"? (Alternativ gerne auch Empfehlungen für andere 
Linux-Terminalprogramme ..)

Danke und Gruß,
Florian

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal send file (^AS) im ASCII-Modus probiert?

Autor: Florian Haskamp (trapperjohn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yalu wrote:
> Schon mal send file (^AS) im ASCII-Modus probiert?

Ja, leider das gleiche Verhalten wie bei "Paste File" :(

Autor: Florian Haskamp (trapperjohn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, falls jemand mal das gleiche Problem hat, so gehts mit Linux 
Bordmitteln:

Konfiguration der Schnittstelle ttyS0 auf Übertragung von "Rohdaten" 
ohne Echo und 9600 Baud:
stty -F /dev/ttyS0 9600 raw -echo

Jetzt kann man einfach per 'cat /dev/ttyS0 > antwort.dat' die Meldungen 
des Controllers entgegennehmen und per 'cat meinkommando.dat > 
/dev/ttyS0' beliebige Daten (im Beispiel den Inhalt der Datei 
meinkommando.dat) an den Mikrocontroller schicken.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mich gerade wegen binär-Daten zum AVR für XModem entschieden in 
der alten Originalversion.

Vorteil: kein Hardware-Handshake nötig und auf große Bufferverwaltungen 
auf dem AVR kann man auch verzichten.
Ein 128-Byte Buffer, dann in Ruhe verarbeiten und dann das ACK schicken, 
damit die nächsten 128 Byte kommen. SOH und Blocknummer bearbeite ich 
gleich beim Empfang, die Prüfsumme, wenn sie am Ende ankommt.

"In Ruhe verarbeiten" heißt natürlich, daß es in der TimeOut-Zeit von 
XModem passieren muß, die ist aber normalerweise so lang, daß der AVR 
noch nebenbei Karten spielen könnte.

Nachteil im Moment ist, daß der AVR die Übertragung mit NAK starten muß.

Da ich das nur nehme, um selten Daten in einen SPI-Flash am AVR zu 
tragen, stört mich das nicht weiter.

Ich benutze TeraTerm unter Windows, da ist mein Ablauf zur Zeit:
AVR Reset mit festgehaltener Taste -> AVR geht in Flash-Routine und 
meldet über UART beim Loslassen der Taste, daß er Daten will.
In TeraTerm XModen->Send und Datei auswählen.
Dann startet XMODEM und wartet.
Taste am AVR drücken, der sendet NAK und es geht los.

Hat für mich den Vorteil, daß es sich überall benutzen läßt und im AVR 
wenig Aufwand erfordert.

Gruß aus Berlin
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.