USB <-> Serial programmieren
-
Hallo
ich habe hier ein Geraet, das internet eine programmierte Prozessor hat und das ueber ein USB <-> Serial man an den USB Port anschliesen kann.Linux erkennt das Geraet auch und bindet es an /dev/ttyUSB0 als character device an. Wie kann ich das Geraet aber ansteuern?
Ich habe schon versucht mit open(2) und read(2) write(2) Daten zu senden und zu empfangen, allerdings funktioniert es nicht.
Ich oeffne es mit
pdata->device = open("/dev/ttyUSB0", O_RDWR | O_SYNC | O_APPEND); // ... ssize_t ret = write(pdata->device, data, length); // ... ssize_t ret = read(pdata->device, data, length);
Das geht auch, es kommt kein Fehler und ich bekomme eine device number. Das schreiben funktioniert auch, ebenfalls kein Fehler. Allerdings versteht das Geraet die gesendeten Befehle nicht, obwohl sie korrekt sind.
Ich muss zuerst "ca1\r", "cb2\r" schicken um das Geraet einzustellen, dann "g" damit das Geraet daten generiert und sie an den USB Port schickt.
Anscheindend werden diese Befehle nicht gesendet.
Unter Windows oeffne ich das Device mit CreateFile(), dann mit WriteFile() und ReadFile() lesen/schreiben. Allerding muss ich zuerst mit SetCommConfig() die baudRate, parity, stopBits und byteSize setzen.
Muss man und wie kann ich sowas unter Linux setzen? Waere echt dankbar fuer Tipps.
Hier sind noch Informationen ueber das Device:
hub 3-0:1.0: unable to enumerate USB device on port 1 usb 5-1: new full speed USB device using uhci_hcd and address 13 usb 5-1: configuration #1 chosen from 1 choice ftdi_sio 5-1:1.0: FTDI USB Serial Device converter detected drivers/usb/serial/ftdi_sio.c: Detected FT232RL usb 5-1: FTDI USB Serial Device converter now attached to ttyUSB0 usb 5-1: New USB device found, idVendor=0403, idProduct=6001 usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 5-1: Product: UM232R USB <-> Serial usb 5-1: Manufacturer: FTDI usb 5-1: SerialNumber: FTAJNGPX
-
Hallo,
für solche Metadaten benutzt man gewöhnlich ioctl Systemcalls.
(Oder fcntl)
-
GNU-Fan schrieb:
Hallo,
für solche Metadaten benutzt man gewöhnlich ioctl Systemcalls.
(Oder fcntl)Danke, werde mal morgen danach suchen. Ich hab in der Zwischenzeit das hier enddeckt:
http://lkml.org/lkml/2003/8/21/95
Das benutzt tcsetattr http://linux.about.com/library/cmd/blcmdl3_tcsetattr.htm dafuer. Sieht vielversprechend aus, weil da eine ganze Implementation den Funktionen hier ist.serial_t *serial_open(const char *devname); void serial_setup(serial_t *serport); void serial_close(serial_t *serport); void serial_write(serial_t *serport, const char *buffer, size_t n); void serial_read(serial_t *serport, char *buffer, size_t n, int wait); void serial_delay(int ms);