Site : tvaira.free.fr
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
Un port série virtuel est une solution logicielle qui émule un port série standard.
Cela permet généralement :
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 :
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.
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.
$ 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
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*
...
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
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
.
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 :
$ sudo chmod 666 /dev/ttyACM0
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
Le GPS émet périodiquement des trames NMEA 0183. Il est possible de tester la réception avec :
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
...
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.
cutecom
: