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);
    

Anmelden zum Antworten