Forum: PC-Programmierung C-Programmierung: USB/RS232 -> /dev/ttyS0 unter Ubuntu 12.04


von Micha (Gast)


Lesenswert?

Hallo Zusammen,

ich habe aus einem Buch ein Programm abgetippt, mit dem ich eine 
USB-Schnittstelle ansteuern möchte. Soweit läuft das Programm zwar ohne 
Fehler, jedoch ohne erkennbare Schreib-/Leseaktivität auf die 
Schnittstelle.
Der Programmer von AVR zumindest zeigt dahingehend keine Aktivität.
Nach meiner Einschätzung müsste der Fehler in untem angegebenem Code zu 
finden sein, er verschließt sich mir jedoch.


Die TERM_DEVICE habe ich mit /dev/ttyS0 bis S9 sowie mit /devv/ttyUSB0 
bis USB7 ausprobiert, jedoch ohne Erfolg.
1
# define TERM_DEVICE "/dev/ttyS4"      /* COM1 */
2
# define TERM_SPEED B9600             /* Baud - Bit pro Sekunde */
3
4
int main()
5
  {
6
    int fd, old_flags;                  /* */
7
    ssize_t length;                    /* Datentyp des Rückgabewertes von sizeof */
8
    char buffer[16];
9
    struct termios term_attr;
10
    fd_set input_fdset;
11
12
    if ((fd = open(TERM_DEVICE, O_RDWR)) == -1)
13
      {
14
        perror("terminal: Can't open device "TERM_DEVICE);
15
        return(1);
16
      }
17
18
/* ########## RS232 konfigurieren ########## */
19
    if (tcgetattr(fd, &term_attr) != 0)
20
      {
21
        perror("terminal: tcgetattr() failed");
22
        return(1);
23
      }
24
25
    term_attr.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CLOCAL | CREAD;  /* */
26
    term_attr.c_iflag = 0;
27
    term_attr.c_oflag = OPOST | ONLCR;
28
    term_attr.c_lflag = 0;
29
30
    if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
31
      perror("terminal: tcsetattr() failed");
32
33
/* ########## Std.-Eingabe anpassen ########## */
34
    if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
35
      {
36
        perror("terminal: tcgetattr() failed");
37
        return(1);
38
      }
39
40
/* ########## Alte Einstellungen sichern ########## */
41
    old_flags = term_attr.c_lflag;
42
    term_attr.c_lflag &= ~(ICANON | ECHO);   /* Canonical-Mode aus */
43
    
44
    if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
45
      perror("terminal: tcsetattr() failed");


Als User gehöre ich folgenden Groups an:
adm uucp dialout cdrom plugdev lpadmin admin sambashare

Mit lsusb finde ich den zum Programmer gehörenden Eintrag:
Bus 004 Device 002: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x 
Composite Device

Hat evtl. jemand eine grundsätzlichen Lösungsansatz oder vielleicht 
einen Tip, wo ich den Fehler finden kann?

Vielen Dank im voraus.

Micha


P.S.: Ich habe im Forum nach ähnlichen Themen ausschau gehalten, ohne 
Erfolg. Sollte mir da etwas entgangen sein entschuldigt bitte diesen 
Eintrag.

von g457 (Gast)


Lesenswert?

> USB/RS232 -> /dev/ttyS0

Normlerweise werden USB-Seriell-Wanlder als ttyUSBn eingebunden. Schaug 
doch mal nach was Du in /dev hast mit solchen Namen.

von Εrnst B. (ernst)


Lesenswert?

Micha schrieb:
> Bus 004 Device 002: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x
> Composite Device

dann versuch dich vielleicht an einer UDEV-Rule:
1
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", SYSFS{idVendor}=="10c4", SYSFS{idProduct}=="ea60", SYMLINK="myprogrammer", GROUP="plugdev", MODE="660"

In eine eigene Datei (z.B. 99-programmer.rules) im /etc/udev/rules.d.

(sudo)
udevadm  control --reload-rules

Gerät einstecken.
Wenn alles passt: /dev/myprogrammer statt /dev/ttyUSB* verwenden.

Wenn du mehrere Geräte mit selber VID/PID hast: SYSFS{serial} o.Ä. mit 
auswerten.

von Smörre R. (smoerre)


Lesenswert?

> Die TERM_DEVICE habe ich mit /dev/ttyS0 bis S9 sowie mit /devv/ttyUSB0
> bis USB7 ausprobiert, jedoch ohne Erfolg.
meinst Du jeweils die erste Programmzeile, also anstatt
# define TERM_DEVICE "/dev/ttyS4"
dann
# define TERM_DEVICE "/dev/ttyUSB0" ,etc.?

von Smörre R. (smoerre)


Lesenswert?

> # define TERM_DEVICE "/dev/ttyS4"      /* COM1 */
ttyS4 ist wohl COM2 ?!
ttyS3 wäre COM1

von Micha (Gast)


Lesenswert?

@Smörre R.
Ausprobiert habe ich /dev/ttyS0 , /dev/ttyS1 usw., ebenso /dev/ttyUSB0, 
/dev/ttyUSB1 usw.. Leider Ohne erfolg.

@Ernst B* : UDEV-Rule kannte ich noch nicht, werde ich aber gleich 
versuchen. Klingt jedenfalls vernünftig, idvendor und idproduct zu 
implementieren.

@g457: Leider gibt es in /dev keinen Eintrag ttyUSBn.

Bitte versteht meinen Post nicht als Versuch, euch meine 
Programmierproblematik aufs Auge zu drücken und mir eine Lösung zu 
erarbeiten. Ich komme mit den C-Grundlagen (inklusive Pointer etc) ganz 
gut zurecht, nun wird es aber Zeit, die Schnittstellenprogrammierung zu 
erlernen.
Finde ich sehr spannend und bin euch für die bisherigen Tipps sehr, sehr 
dankbar und werde diese gleich mal ausprobieren.

Werde Erfolgsmeldung oder mein Scheitern hier posten.

Micha

von Micha (Gast)


Angehängte Dateien:

Lesenswert?

@g457: Leider gibt es in /dev keinen Eintrag ttyUSBn.

Muss ich korrigieren. Der Eintrag in /dev lautet ttyUSB0. Das Programm 
scheint mit dieser Zuweisung ja ohne Fehler zu funktionieren, jedoch 
sehe ich keine Aktivität der Schnittstelle. Denn es sollte eine grüne 
LED beim übertragen kurz aufleuchten.

@Ernst B* : Zu UDEV-Rule. Ich habe die Datei mit den entsprechenden 
Einträgen erstellt, rules reload durchgeführt und sogar meinen PC neu 
gestartet.
Folgende Fehlermeldung wird angezeigt:
terminal: Can't open device /dev/myprogrammer: No such file or directory

Ich habe mal die Programmdatei im Anhang geladen. Vielleicht liegt der 
Fehler auch an anderer Stelle.

von g457 (Gast)


Lesenswert?

> Denn es sollte eine grüne LED beim übertragen kurz aufleuchten.

Überträgst Du dazu auch schnell genug? Mach mal sowas wie
$ cat < /dev/urandom > /dev/ttyUSB0
(..behelfsweise eine Datei mit gegenstellenverträglichem Inhalt 
übertragen..).

Und ad UDEV: Bevor Du noch eine weitere Baustelle aufmachst brings erst 
mal hardcoded zum laufen. Danach dann CLI-Parameter und 
UDEV-Vereinfachungen einzuführen ist das Sahnehäubchen - für DANACH.

von Micha (Gast)


Lesenswert?

Ich habe den Hardwarehandshake CRTSCTS auskommentiert (Zeile 38), schon 
gehts.

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.