Forum: Mikrocontroller und Digitale Elektronik Arduino was sendet Serial.write Serial.print


von Stefan S. (buffalochill)


Lesenswert?

Hallo Leute,

was genau sendet der arduino seriell aus wenn ich den befehl benutze:

serial.write("<A>");
serial.print("<A>");

das sind ja nun ascii zeichen aber kommt nach jedem von mir bestimmten 
zeichen noch ein weiteres zeichen sowas wie carriage return oder new 
line oder sowas ?
ich versuche grade meinen Arduino mit meinem Assembler AVR kommunizieren 
zu lassen und da ist mir aufgefallen dass nach < erstmal noch ein 
anderes Zeichen reinkommt statt des A. aber was für eins ?

Gruß
Stefan

von Jim M. (turboj)


Lesenswert?

Stefan S. schrieb:
> zu lassen und da ist mir aufgefallen dass nach < erstmal noch ein
> anderes Zeichen reinkommt statt des A. aber was für eins ?

Da darf keins kommen. Irgendwas ist bei Dir faul.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

> was genau sendet der arduino seriell aus wenn ich den befehl benutze:
>
> serial.write("<A>");
> serial.print("<A>");

Bei beiden ist erstmal kein Unterschied.

Es wird ein '<' gesendet, dann ein 'A' und dann ein '>'. Was willst Du 
denn wirklich schicken? Vielleicht nur ein 'A' gefolgt von CR und LF?

Dann:

serial.println ("A");

> das sind ja nun ascii zeichen aber kommt nach jedem von mir bestimmten
> zeichen noch ein weiteres zeichen sowas wie carriage return oder new
> line oder sowas ?

serial.println ("Hello World") hängt automatisch ein CR und ein LF an. 
Alternativ kannst Du schreiben:

serial.print ("Hello World\r\n")

: Bearbeitet durch Moderator
von Amateur (Gast)


Lesenswert?

Google kaputt gemacht?

Wenn nicht:
https://www.arduino.cc/en/Serial/write

https://www.arduino.cc/en/Serial/print

Im Übrigen sollte .print nicht so benutzt werden.

PS: Willst Du einen Zeilenvorschub ausgeben, so musst Du das dem System 
schon sagen bzw. ihn in den String einbauen oder abhängen.

von Stefan S. (buffalochill)


Lesenswert?

würde ich auch sagen nur speichere ich jedes byte ab sobald das < kommt.
in meiner hauptroutine wird dann geschaut ob die übertragung fertig ist 
und dann wird ausgewertet, nun ist es so dass das Erste byte ein < ist 
danach kommt irgendwas anderes und erst dann kommt das A...


USART_RXC:
    in    temp, UDR  ; Daten empfangen gucken ob start
    cpi    temp, 60  ; < Startzeichen gesendet ?
    breq  USART_START    ; ja dann speichern für nächstes zeichen

    lds    temp, RXStart
    cpi    temp, 1
    breq  USART_Zeichen_1
    cpi    temp, 2
    breq  USART_Zeichen_2
    cpi    temp, 3
    breq  USART_Zeichen_3

USART_START:
    sts    ASCII, temp
    ldi    temp, 1
    sts    RXStart, temp    ; Startzeichen
    reti
USART_END:
    clr    temp
    sts   RXStart, temp
;RXStart auf 0 stellen weil übertragung beendet wurde und damit der kram 
beim nächsten mal von vorne losgeht
    ldi    temp, 1
    sts    RXEnd, temp      ; RXEnd auf 1 stellen... String wurde 
empfangen und hauptroutine darf das jetzt von ascii nach bin umrechnen
    reti

USART_Zeichen_1:
    in     temp, UDR
    sts    ASCII1, temp
    ldi    temp, 2
    sts    RXStart, temp
    reti
USART_Zeichen_2:
    in     temp, UDR
    sts    ASCII2, temp
    cpi    temp, 62
; > Endzeichen wurde gesendet ? dann merker setzen für die ASCII 2 Bin 
Umrechnung
    breq          USART_END
    ldi    temp, 3
    sts    RXStart, temp
    reti
USART_Zeichen_3:
    in     temp, UDR
    sts    ASCII3, temp
    cpi    temp, 62      ; > Endzeichen wurde gesendet ? dann merker 
setzen für die ASCII 2 Bin Umrechnung
    breq          USART_END
    ldi    temp, 4
    sts    RXStart, temp
...
das geht das so weiter bis zu 13 Zeichen...

von Stefan S. (buffalochill)


Lesenswert?

was ich schicken will ist <A> mehr nicht... das < kommt an dann kommt 
irgendwas anderes dann das A.
Ob zwischen A und > dann wieder irgendwas kommt kann ich noch nicht 
sagen

also so im speicher steht dann folgendes :

ASCII: <
ASCII1: irgendwas
ASCII2: A

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan S. schrieb:
> also so im speicher steht dann folgendes :
>
> ASCII: <
> ASCII1: irgendwas
> ASCII2: A

Stefan S. schrieb:
> ich versuche grade meinen Arduino mit meinem Assembler AVR kommunizieren
> zu lassen

Dafür kann es mehrere Gründe geben:

1. Deine Empfangsroutine in Assembler auf dem AVR hat einen Bug.
2. Die verwendete Baudrate (welche?!?) stimmt nicht genau genug überein.
3. Datenbreite oder Parity stimmen nicht überein.

Jedenfalls können wir das nicht aus einer Zeile Code herauslesen. Die 
Glaskugel habe ich verliehen.

Um 1. auszuschließen, könnte man mit einem USB-UART-Adapter am PC 
mitlesen. Für 2. und 3. braucht man mehr Informationen.

: Bearbeitet durch Moderator
von S. Landolt (Gast)


Lesenswert?

> 1. Deine Empfangsroutine in Assembler auf dem AVR hat einen Bug.
> 2. Die verwendete Baudrate (welche?!?) stimmt nicht genau genug überein.
> 3. Datenbreite oder Parity stimmen nicht überein.

Wenn da tatsächlich '<' und 'A' ankommt, so sollte man doch 2. und 3. 
ausschließen können, dann bleibt nur noch 1.

von Stefan S. (buffalochill)


Lesenswert?

baudrate is beim avr 9600 UBRR= 103  bei 16MHz kein doublespeed...
und im arduino Serial.Begin(9600)

hier meine UART einstellungen:

    ldi    temp, (1<<UDRE)  | (0<<U2X)
; schreiben in Transmit-Buffer erlauben, kein double speed
    out    UCSRA, temp

    ldi    temp, (1<<RXCIE) | (1<<RXEN) | (0<<TXEN) | (0<<UCSZ2)
; RX Complete interrupt einschalten | Receiver einschalten | Transmitter 
ausschalten | kein 9-Bit-Modus

                 out    UCSRB, temp

    ldi    temp, (1<<URSEL) | (0<<UMSEL) | (0<<UPM0) | (0<<USBS) | 
(3<<UCSZ0)

; in UCSRC schreiben | Asynchron | keine Parity | 8 Datenbits | 1 
Stopbit
    out    UCSRC, temp

    ldi    temp, 0    ;----------\
    out    UBRRH, temp  ;           \  UBBR auf 103
    ldi    temp, 103  ;
    out    UBRRL, temp  ;----------/

von Georg (Gast)


Lesenswert?

Hallo,

da sowohl das Senden wie auch der Empfang buggy sein können (manchmal 
beides), prüft man in so einem Fall erst mal nach, was real auf der 
Leitung gesendet wird - tritt da das unerwünschte Zeichen auf, so ist 
das Senden kaputt, ist die Zeichenfolge auf der Verbindungsleitung 
korrekt, so stimmt mit dem Empfang was nicht.

Georg

von Stefan S. (buffalochill)


Lesenswert?

hallo leute

ich hab and port b jetzt 8 leds und kann dort sehen was in den einzelnen 
registern steht die ich vom arduino gesendet bekomme.

Arduino sendet:       Serial.print("<0B254>");
das kkommt auch so über den seriellen monitor raus..

gespeichert im assembler AVR wird: <<0B254>

also das wundert mich jetzt schon weil die software sieht ok xD ?!

von Stefan S. (buffalochill)


Lesenswert?

ich habs etwas umgeschrieben jetzt tuts
<0B254>

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.