linux
Mapping special names to multiple USB serial adapters
by mark on Apr.17, 2010, under Solar, linux
The watts clever envi has a USB serial adapter which is a Prolific pl2303. When inserted it is assigned /dev/ttyUSB0 by udev, among a few other symlinks. I have now obtained an RS485 serial adapter on ebay for A$13.98 delivered which uses the exact same chip, which makes it indistiguishable from the envi’s port. What I needed was a way to guarantee uniqueness regardless of the enumeration order on boot or random hot plugin. Naturally, this is for the Aurora GCI which will be installed when they become available in May.
Researching udev a bit, I found /lib/udev/rules.d/60-persistent-serial.rules (mine is a debian system). This file shows how the standard symlinks are done. Since each USB port is unique, I should be able to use that uniqueness to map another symlink to the device.
Firstly plug in the device in the chosen USB port and issue
udevadm info --query=all --name=/dev/ttyUSB1
This shows a heap of stuff but mainly we are interested in
P: /devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1:1.0/ttyUSB1/tty/ttyUSB1
Create a file in /etc/udev/rules.d/70-persistent-serial.rules which contains
#see /lib/udev/rules.d/60-persistent-serial.rules
ACTION!=”add|change”, GOTO=”persistent_serial_end”
SUBSYSTEM!=”tty”, GOTO=”persistent_serial_end”
KERNEL!=”ttyUSB[0-9]*|ttyACM[0-9]*”, GOTO=”persistent_serial_end”IMPORT=”usb_id –export %p”
#IMPORT=”path_id %p”ENV{ID_SERIAL}==”", GOTO=”persistent_serial_end”
# usb nearest ethernet connector
ENV{DEVPATH}==”*usb2/2-2/2-2:1.0*”, SYMLINK+=”serial/by-name/envi”
#bottom front connector
ENV{DEVPATH}==”*usb7/7-1/7-1:1.0*”, SYMLINK+=”serial/by-name/rs485″
# usb below nearest ethernet connector
ENV{DEVPATH}==”*usb2/2-1/2-1:1.0*”, SYMLINK+=”serial/by-name/rs485″LABEL=”persistent_serial_end”
Replug and voila you get /dev/serial/by-name/rs485 which will always be the correct device.
Now I just have to run the wire to where the GCI will be installed.
Funny Characters for gcc/g++ errors and warnings
by mark on Apr.01, 2010, under linux
I have found that on some linux systems when you compile with gcc and g++ the error messages have funny characters like
test.c: In function â:
test.c:6: warning: unused variable â
This is due to the default locale being set to something other than the default.
in /etc/default/locale you will have a line like
LANG="en_AU.UTF-8"
add
LC_CTYPE=C
Restart the shell and compile again and the errors are now meaningful.
test.c: In function 'main':
test.c:6: warning: unused variable 'x'
Naturally you could set it in the local shell for the session, but then you would have to do it every time.



