Forum: PC-Programmierung arduino nano seriell (rs232) <-> usb linux (ubuntu14.04) Port Config


von Fabian S. (fabian727)


Angehängte Dateien:

Lesenswert?

moin @ all,

ich bin gerade dabei eine RGB-LED-Leiste von meinem Computer 
anzusteuern.

Dafür habe ich ein Arduino Nano programmiert und über die vorhandene 
uart Schnittstelle und den Wandler an einen USB-Anschluss meines 
Computers angeschlossen.

Zum Test habe ich mit minicom meine Befehle an den arduino geschickt. 
Diese werden richtig interpretiert.

Daraufhin habe ich ein Programm für den Computer aufgesetzt, was minicom 
ersetzen soll und später des weiteren eine grafische Oberfläche anbieten 
soll.

Hier fängt es mit meinen Problemen an.
Ist minicom im Hintergrund gestartet, kann ich Befehle senden, die 
interpretiert werden. Ist minicom nicht gestartet, so bekomme ich nach 
dem Schreiben beim "select" einen Timeout.

Anbei ist mein Code.
Ich habe bereits die Konfiguration des Ports mit stty getestet.
Die Ausgabe nachdem minicom gestartet worden ist:
1
 stty -F /dev/ttyPWM0 -a
2
speed 38400 baud; rows 0; columns 0; line = 0;
3
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; eol = <undef>;
4
eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>;
5
werase = <undef>; lnext = <undef>; flush = <undef>; min = 0; time = 5;
6
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
7
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel
8
-iutf8
9
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
10
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

Die Ausgabe nachdem das Programm ausgeführt wurde:
1
 stty -F /dev/ttyPWM0 -a
2
speed 38400 baud; rows 0; columns 0; line = 0;
3
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; eol = <undef>;
4
eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>;
5
werase = <undef>; lnext = <undef>; flush = <undef>; min = 0; time = 5;
6
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
7
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel
8
-iutf8
9
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
10
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

Soweit wie ich sehe, sind die Ausgaben identisch.

Meine Frage: wo ist der Fehler? :-) Die Kommunikation zwischen Computer 
(minicom) und arduino nano funktioniert. Es muss an meiner Konfiguration 
im Programm liegen...?

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Als erstes wäre es mir neu, das sich ein Arduino als ttyPWM (was soll 
das sein?) anmeldet, in der Regel heißen die ttyACM oder ttyUSB

von Fabian S. (fabian727)


Lesenswert?

Hi,

Danke für deine Antwort.
Ich habe eine udev Regel erstellt. Diese erstellt diesen symlink.

Wir oben schon geschrieben, die Kommunikation funktioniert, wenn minicom 
in Hintergrund offen ist... nur wenn minicom nicht läuft, funktioniert 
dir Kommunikation nicht. Dann kommt bei select ein timeout...

von Uartguru (Gast)


Lesenswert?

Der select()-Aufruf ist IMO nicht korrekt. Der erste Parameter is 
"nfds".
"man select" sagt dazu:
1
The first nfds descriptors are checked in each set; i.e., the descriptors from 0 through nfds-1 in the descriptor sets are examined.  (Example: If you have set two file descriptors "4" and "17", nfds should  not be "2", but rather "17 + 1" or "18".)  On return, select() replaces the given descriptor sets with subsets consisting of those descriptors that are ready for the requested operation.  Select() returns the total number of ready descriptors in all the sets.

von Fabian S. (fabian727)


Angehängte Dateien:

Lesenswert?

danke für deine Hilfe.
Tatsächlich war mein select Aufruf verkehrt.
Leider hat das nicht mein Problem behoben...
Inzwischen habe ich den Bus mit einem LA mitgeschnitten.

Die Übertragung funktioniert einwandfrei. Jedoch wird danach aus einem 
mir unbekannten Grund eine zusätzliche Flanke gesendet, parallel zu der 
des ICs.
Ich vermute, dass hier das Problem herkommt.

Interessanterweise wird diese Flanke weder von IC noch vom Computer 
gesendet, wenn minicom parallel geöffnet ist.

Wer kann mir sagen, was das für eine Flanke ist und wo sie herkommt?

Das i-tüpfelchen wäre dann noch, wie ich sie los werde ;-)

Jeder Hinweis wird gerne in Empfang genommen.

: Bearbeitet durch User
von Fabian S. (fabian727)


Lesenswert?

hat hier echt keiner eine Antwort für dieses Phänomen?

von -.-.- (Gast)


Lesenswert?

Fabian S. schrieb:
> Die Übertragung funktioniert einwandfrei. Jedoch wird danach aus einem
> mir unbekannten Grund eine zusätzliche Flanke gesendet, parallel zu der
> des ICs.
> Ich vermute, dass hier das Problem herkommt.
>
> Interessanterweise wird diese Flanke weder von IC noch vom Computer
> gesendet, wenn minicom parallel geöffnet ist.
>
> Wer kann mir sagen, was das für eine Flanke ist und wo sie herkommt?
>
> Das i-tüpfelchen wäre dann noch, wie ich sie los werde ;-)
>
> Jeder Hinweis wird gerne in Empfang genommen.

Je nachdem ob du die China Version von deinem saleae benutzt, kommt es 
durchaus vor, das du ein "überspringen" hast. Wenn dann wäre da ein 
gewaltiger zoom interessant. Wenn der Ausschlag nur für eine clk oder so 
ist, würde ich behaupten es gilt der Satz: "Wer misst misst Mist"

von Fabian S. (fabian727)


Lesenswert?

Ich habe die originale Version.
Es ist tatsächlich nur 1 Clock lang.

Faszinierend ist aber, dass der Controller mit diesem Peak nicht so 
agiert, wie er soll.

Ist Minicom im Hintergrund geöffnet, erscheint das Peak nicht und der 
Microcontroller agiert so wie er soll...

ich glaube an das Peak, das ich hier auch messen konnte. Die Frage ist 
und bleibt: wo kommt es her? Also was exakt fabriziert der Computer, was 
er eigentlich nicht soll...?

An meinem Code hat sich im Prinzip nichts geändert. Ich habe einige 
Flags noch mal hinzugefügt / weg gelassen. Das Prinzip ist immernoch das 
gleiche.

von Fabian S. (fabian727)


Lesenswert?

Ich schicke bereits LF / CR mit.

Das hier ist meine Main...

Ich habe es gerade auch mit \r ausprobiert, bzw \r\n, \n\r.

int main(int argc, char *argv[])
{
    terminal serialport;
    char data[16] = "1:0,0,0!\n";
    serialport.send(&data[0]);
    usleep(10000);
    memset(&data[0],0,16);
    data[15] = '\0';
    serialport.receive(&data[0]);
    serialport.~terminal();
    return 0;
}


Keine Änderung...

von Marek W. (ma_wa)


Lesenswert?

Nur ein Verdacht. Kann es sein, das Minicom dir dein TTY konfiguriert 
und du ggf. ohne Minicom mit der falschen Baudrate oder dem falsche 
Bitsetting arbeitest?

von Fabian S. (fabian727)


Lesenswert?

meine Vermutung ist diese. Jedoch habe ich bereits 5 unterschiedliche 
Beispiele aus dem Internet kopiert. Diese nach erstmaligen ausprobieren 
meiner Meinung nach angepasst. Es hat nie etwas funktioniert.

Die Baudrate passt, zumindest die ich auswähle.

Auf dem Bus sieht auch alles passend aus.

Ich hab bereits öfters mit stty -aF /dev/ttyPWM0 (ttyPWM0 ein Zeiger mit 
Zugriffserlaubnis für Nutzer auf ttyUSB0) die Ausgabe nach minicom und 
nach dem Programm angeschaut, sieht identisch aus.



Aktuell vermute ich, dass ich zu schnell schicke und der Atmega nicht 
hinterher kommt... somit würden daten verloren gehen auf dem weg.

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.