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


von Günther F. (taraquedo)


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:
1
for (uint32_t i=0; i<length; i++)
2
{
3
     if (i%16 == 0)
4
     {
5
          // Adressen alle 16Byte anzeigen
6
          uart_puts_p(PSTR("\n"));
7
          uart_putdw_hex(i);
8
          uart_puts_p(PSTR(":  "));
9
     }
10
     // Zeichen einlesen
11
     uint8_t c = uart_getc();
12
     // Ausgeben, wenn druckbar
13
     if (c > 0x1F && c < 0x7F)
14
          uart_putc(c);
15
     else
16
          uart_putc('.');
17
     // TODO: Mit den Daten was machen
18
}

Grüße!

von Karl H. (kbuchegg)


Lesenswert?

> Was mache ich falsch? Stimmt irgendein Timing nicht?

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

von Günther F. (taraquedo)


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!

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Florian H. (trapperjohn)


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

von yalu (Gast)


Lesenswert?

Schon mal send file (^AS) im ASCII-Modus probiert?

von Florian H. (trapperjohn)


Lesenswert?

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

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

von Florian H. (trapperjohn)


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.

von Michael U. (amiga)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.