Site : tvaira.free.fr

Mise en oeuvre d’un port série sous Linux

Le port série RS-232

RS-232 est une norme standardisant une voie de communication de type série sur trois fils minimum. Disponible sur presque tous les PC depuis 1981 jusqu’au milieu des années 2000, il est communément appelé le « port série ».

Sur les systèmes d’exploitation MS-DOS et Windows, les ports RS-232 sont désignés par les noms COM1, COM2, etc. Cela leur a valu le surnom de « ports COM », encore utilisé de nos jours.

On utilise maintenant des adaptateurs USB/RS-232 car les PC ne disposent plus d’interfaces physiques RS-232. Cela revient à exploiter une port série virtuel.

Lien : https://fr.wikipedia.org/wiki/RS-232

Le port série virtuel

Un port série virtuel est une solution logicielle qui émule un port série standard.

Cela permet généralement :

  • d’augmenter le nombre de ports série (sans installation de matériel supplémentaire mais dans les limites des ressources disponibles)
  • de partager les données en provenance d’un périphérique entre plusieurs applications
  • de raccorder un périphérique série standard (RS232, …) sur un port USB avec un adaptateur (manque ou absence de ports série physiques disponibles)

Pour établir une communication effective via un port série physique (RS-232) ou virtuel, il est nécessaire de définir le protocole utilisé : notamment, le débit de la transmission (en bits/s), le codage utilisé, le découpage en trame, etc. La norme RS-232 laisse ces points libres, mais en pratique on utilise souvent des trames d’un caractère ainsi constituées :

  • 1 bit de départ (START)
  • 7 à 8 bit de données
  • 1 bit de parité optionnel (aucune, paire ou impaire)
  • 1 ou plusieurs bits d’arrêt (STOP)

Prise en charge d’un périphérique USB

Il est conseillé de lire ou de s’aider de ce document avant de poursuive.

Attention : Ce document décrit la prise en charge du péripéhrique USB : GPS Receiver de MTK. Vous pouvez l’adapter en fonction de vos besoins.

Détection

Avant :

$ lsusb > lsusb-avant.txt
$ lsmod > lsmod-avant.txt
$ dmesg > dmesg-avant.txt

Brancher maintenant le périphérique USB.

Après :

$ lsusb > lsusb-apres.txt
$ lsmod > lsmod-apres.txt
$ dmesg > dmesg-apres.txt

Analyse :

$ diff lsusb-avant.txt lsusb-apres.txt 
> Bus 002 Device 011: ID 0e8d:3329 MediaTek Inc.
  • Le système a détecté un nouveau périphérique USB. Ce périphérique est identifié par son idVendor=0e8d et son idProduct=3329.
$ diff dmesg-avant.txt dmesg-apres.txt 
> [204555.128418] usb 2-1.4: new full-speed USB device number 10 using ehci-pci
> [204555.223664] usb 2-1.4: New USB device found, idVendor=0e8d, idProduct=3329
> [204555.223669] usb 2-1.4: New USB device strings: Mfr=3, Product=4, SerialNumber=0
> [204555.223672] usb 2-1.4: Product: GPS Receiver
> [204555.223674] usb 2-1.4: Manufacturer: MTK
> [204555.257427] cdc_acm 2-1.4:1.1: ttyACM0: USB ACM device
> [204555.257994] usbcore: registered new interface driver cdc_acm
> [204555.257997] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
  • Le périphérique USB a été détecté physiquement par le noyau. C’est un “GPS Receiver” de MTK (idVendor=0e8d, idProduct=3329). Le pilote de périphérique (driver) associé à ce matériel est cdc_acm.
$ diff lsmod-avant.txt lsmod-apres.txt 
> cdc_acm                26991  2

$ modinfo cdc_acm
filename:       /lib/modules/3.8.0-44-generic/kernel/drivers/usb/class/cdc-acm.ko
alias:          char-major-166-*
license:        GPL
description:    USB Abstract Control Model driver for USB modems and ISDN adapters
author:         ...
srcversion:     AD91845189110F8BEC40793
...
alias:          usb:v0E8Dp3329d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0E8Dp0003d*dc*dsc*dp*ic*isc*ip*in*
...
  • Le module (le driver) cdc_acm associé à ce matériel a été chargé par le système.
$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 sept. 18 16:24 /dev/ttyACM0
  • Le périphérique sera accessible par le fichier spécial ttyACM0 dans /dev.

Attention : le périphérique ne sera accessible en lecture/écriture que par l’utilisateur propriétaire root et les membres du groupe dialout.

Droits d’accès

Par défaut, le système applique la politique des droits d’accès rw-rw---- pour ce type de périphérique USB :

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 sept. 18 16:24 /dev/ttyACM0

Ici, le périphérique sera accessible en lecture/écriture par l’utilisateur propriétaire root et les membres du groupe dialout. Tous les autres (other) utilisateurs auront aucun accès.

Pour modifier cette situation, vous avez les possibilités suivantes :

  • changer les droits manuellement (à chaque fois !) : $ sudo chmod 666 /dev/ttyACM0
  • ajouter l’utilisateur demandeur (ici toto) dans le groupe dialout : $ sudo adduser toto dialout

Pour une gestion automatique, il faudra passer par udev qui est maintenant le service qui prend en charge le répertoire /dev.

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 sept. 18 16:24 /dev/ttyACM0

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", MODE="0666"

$ ls -l /dev/ | grep ACM
crw-rw-rw-  1 root dialout   166,   0 sept. 18 17:08 ttyACM0

Il est aussi possible de créer un lien symbolique au choix :

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", MODE="0666", SYMLINK+="gps"

$ ls -l /dev/ | grep "\(ACM\|gps\)"
lrwxrwxrwx  1 root root             7 sept. 18 17:10 gps -> ttyACM0
crw-rw-rw-  1 root dialout   166,   0 sept. 18 17:10 ttyACM0

Ou de fixer le nom du fichier spécial :

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", MODE="0666", NAME="ttyUSB1", 
SYMLINK+="gps"

$ ls -l /dev/ | grep "\(gps\|USB\)"
lrwxrwxrwx  1 root root             7 sept. 18 17:12 gps -> ttyUSB1
crw-rw-rw-  1 root dialout   166,   0 sept. 18 17:12 ttyUSB1

Tests

Le GPS émet périodiquement des trames NMEA 0183. Il est possible de tester la réception avec :

  • la commande screen (Ctrl-a k pour sortir) :
$ screen /dev/ttyACM0 115200
$GPRMC,000936.799,V,0000.0000,N,00000.0000,E,,,060180,,*10
$GPVTG,,T,,M,,N,,K*4E
$GPGGA,000937.799,0000.0000,N,00000.0000,E,0,00,,,M,,,,0000*04
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,000937.799,V,0000.0000,N,00000.0000,E,,,060180,,*11
$GPVTG,,T,,M,,N,,K*4E
$GPGGA,000938.799,0000.0000,N,00000.0000,E,0,00,,,M,,,,0000*0B
...
  • l’utilitaire picocom (Ctrl-a Ctrl-x pour sortir) :
$ picocom -b 115200 /dev/ttyACM0 
picocom v1.4

port is        : /dev/ttyACM0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : ascii_xfr -s -v -l10
receive_cmd is : rz -vv

Terminal ready
$GPGGA,064509.842,4405.2015,N,00457.8701,E,0,00,,,M,,,,0000*05
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,12,29,80,028,,31,61,278,,25,55,092,,21,29,178,*73
$GPGSV,3,2,12,26,28,296,,12,17,102,,02,14,041,,14,06,218,*74
$GPGSV,3,3,12,05,06,076,,20,03,123,,23,02,333,,16,02,290,*77
$GPRMC,064509.842,V,4405.2015,N,00457.8701,E,,,041015,,*1E
$GPVTG,,T,,M,,N,,K*4E
...

Remarque : 115200 est le débit de la “ligne” en bits/s.

  • le logiciel cutecom :

Retour au sommaire