Serielle RS485-Anschlüsse einrichten

1820
Schnoof

Ich versuche, eine RS485-PCI-Karte auf einem Computer zum Laufen zu bringen, auf dem Debian Jessie installiert ist (mit systemd). Ich habe den Kernel mit einem Patch des Kartenherstellers angepasst. Dies scheint zu funktionieren, da die Karte erkannt wird und alle acht seriellen Anschlüsse initialisiert werden.

Der Kernel sollte die folgenden Eigenschaften festlegen:

.flags = FL_BASE0, .base_baud = 921600, .uart_offset = 0x200, 

Als ich versuchte, mit diesen Ports zu arbeiten, sah ich immer die Baudrate von 921600. Seitdem habe ich Folgendes geändert: Ich habe den ModemManager deinstalliert (da er die seriellen Ports nicht gestoppt hat und auf diesem Computer kein Modem vorhanden ist) . Ich habe /etc/udev/rules.d/ Regeln hinzugefügt, um symbolische Links zu erstellen und Benutzer und Gruppe dieser RS485-Ports zu ändern. Ich habe die Gruppen so angepasst, dass ich diese Ports nicht nur als root lesen und schreiben kann.

Seitdem merke ich merkwürdiges Verhalten. Die Baudrate wird mit 921600 initialisiert (ich schaue dies mit "dmsg" nach), aber wenn ich es auslese, wird es auf 9600 gesetzt (mit "stty -F / dev / stty11 -a").

Zum Schluss habe ich folgende Ausgaben:

me@my-system:$ sudo udevadm info -a -p $(udevadm info -q path -n /dev/ttyS11)  Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device.  looking at device '/devices/pci0000:00/0000:00:1b.2/0000:06:00.0/0000:07:0f.0/tty/ttyS11': KERNEL=="ttyS11" SUBSYSTEM=="tty" DRIVER=="" ATTR=="17" ATTR=="11" ATTR=="0x0" ATTR=="21" ATTR=="0x13000040" ATTR=="0xDF100000" ATTR=="0" ATTR=="0" ATTR=="14745600" ATTR=="64" ATTR=="50" ATTR=="3000" ATTR=="2"  looking at parent device '/devices/pci0000:00/0000:00:1b.2/0000:06:00.0/0000:07:0f.0': KERNELS=="0000:07:0f.0" SUBSYSTEMS=="pci" DRIVERS=="serial" ATTRS=="17" ATTRS=="0x0702" ATTRS=="0" ATTRS=="0x070002" ATTRS=="(null)" ATTRS=="1" ATTRS=="32" ATTRS=="32" ATTRS=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000000f" ATTRS=="0x90f0" ATTRS=="" ATTRS=="0-3" ATTRS=="0x1402" ATTRS=="0x0010" ATTRS=="-1" ATTRS=="0"  looking at parent device '/devices/pci0000:00/0000:00:1b.2/0000:06:00.0': KERNELS=="0000:06:00.0" SUBSYSTEMS=="pci" DRIVERS=="" ATTRS=="18" ATTRS=="0x0000" ATTRS=="0" ATTRS=="0x060401" ATTRS=="(null)" ATTRS=="1" ATTRS=="32" ATTRS=="32" ATTRS=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000000f" ATTRS=="0x8892" ATTRS=="1" ATTRS=="0-3" ATTRS=="0x1283" ATTRS=="0x0000" ATTRS=="-1" ATTRS=="1"  looking at parent device '/devices/pci0000:00/0000:00:1b.2': KERNELS=="0000:00:1b.2" SUBSYSTEMS=="pci" DRIVERS=="pcieport" ATTRS=="18" ATTRS=="0x8086" ATTRS=="0" ATTRS=="0x060400" ATTRS=="(null)" ATTRS=="1" ATTRS=="32" ATTRS=="32" ATTRS=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000000f" ATTRS=="0xa169" ATTRS=="1" ATTRS=="0-3" ATTRS=="0x8086" ATTRS=="0x7270" ATTRS=="-1" ATTRS=="0"  looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS=="" 

Setserial verwenden:

me@my-system:$ sudo setserial -a /dev/ttyS11 /dev/ttyS11, Line 11, UART: undefined, Port: 0x0000, IRQ: 17 Baud_base: 921600, close_delay: 50, divisor: 0 closing_wait: 3000 Flags: spd_normal skip_test 

Und die aktuelle Einstellung lesen:

me@my-system:$ sudo stty -F /dev/ttyS11 -a speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 

In / proc / tty / driver / befindet sich eine Datei "seriell":

serinfo:1.0 driver revision: ... 11: uart:XR17D15X mmio:0xDF100000 irq:17 tx:0 rx:0 12: uart:XR17D15X mmio:0xDF100200 irq:17 tx:0 rx:0 13: uart:XR17D15X mmio:0xDF100400 irq:17 tx:0 rx:0 14: uart:XR17D15X mmio:0xDF100600 irq:17 tx:0 rx:0 15: uart:XR17D15X mmio:0xDF100800 irq:17 tx:0 rx:0 16: uart:XR17D15X mmio:0xDF100A00 irq:17 tx:0 rx:0 17: uart:XR17D15X mmio:0xDF100C00 irq:17 tx:0 rx:0 18: uart:XR17D15X mmio:0xDF100E00 irq:17 tx:0 rx:0 

Was ist hier falsch? Warum ändert sich die Baudrate? Wie kann ich das vermeiden? Ist "UART: undefined" in Ordnung?

1
Ignorieren Sie die im Kernel log / dmesg angegebene Baudraten-Nummer. Legen Sie den Inhalt der Dateien in `/ proc / tty / driver 'ab. sawdust vor 7 Jahren 1
@sawdust Ich habe die entsprechenden Informationen von `/ proc / tty / driver 'hinzugefügt. In diesem Verzeichnis ist nur eine Datei "serial" enthalten. Schnoof vor 7 Jahren 0

1 Antwort auf die Frage

1
Schnoof

Das Problem ist gelöst und es ist wirklich dumm. Derjenige, der mich gebeten hat, den Computer einzurichten, sagte mir, dass der Computer eine RS485-Karte enthält, aber eine RS232-Karte wurde bestellt und gekauft. Beide Karten werden unter demselben Namen unter Verwendung der gleichen Handbücher und Patches vertrieben. Es war also nicht leicht zu sehen. Ich habe mir die RS486-Karte einer anderen Maschine geliehen und alles funktioniert einwandfrei.

Ich fühle mich sehr unwohl dabei, aber es war zumindest nicht meine Schuld.