Spécification vitesse de transmission non standard pour le port série virtuel FTDI sous Linux

StackOverflow https://stackoverflow.com/questions/3192478

Question

J'ai un périphérique USB, je suis en train de communiquer avec un port série virtuel fourni par le module ftdi_sio noyau. Cependant, je vais avoir des ennuis régler la vitesse de transmission du port à 14400:

  • termios.h ne précise pas une constante pour 14400, donc je ne peux pas utiliser cfsetispeed et cfsetospeed.
  • Dans la source pour le module ftdi_sio noyau, base de transmission est réglé sur 24000000 et il ne semble pas être un moyen de le changer. Cela signifie que je ne peut pas utiliser un diviseur personnalisé avec l'ioctl TIOCSSERIAL et d'obtenir une vitesse de transmission 14400 de cette façon.
  • La source du module a un commentaire qui rend le son comme le réglage de l'élément de alt_speed de la structure tty_struct pour le port 14400 serait faire ce que je veux, mais il ne semble pas être un moyen de le mettre à 14400 compte tenu de l'existant interfaces.

Est-ce que quelqu'un a des idées à ce sujet? Il serait assez facile de résoudre ce problème en piratant le module du noyau, mais je suis vraiment à la recherche d'une solution qui ne nécessite pas des modifications du noyau.

Était-ce utile?

La solution

Vous ne pouvez pas changer la base baud, je suppose qu'il est lié au matériel. Alors déconner avec le module ne fera aucun bien. Dans votre troisième point que vous ne parlez que la première méthode proposée pour la fixation d'un baudrate personnalisé, où vous devez accéder au tty->alt_speed. Il semble qu'il n'y ait pas d'interface à struct TTY ensemble directement à partir de l'espace utilisateur, au moins pas avec le pilote ftdi_sio.
Cependant, il y a une autre méthode expliquée dans les commentaires:

     * 3. You can also set baud rate by setting custom divisor as follows
     *    - set tty->termios->c_cflag speed to B38400
     *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
     *      follows:
     *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
     *      o custom_divisor set to baud_base / your_new_baudrate

Avez-vous l'essayer?

Autres conseils

Les travaux de solution de Shodanex avec un Polaris Spectra NDI (Les 1.2mbps de transmission) sous Linux. Comme spécifié, ouvrir le périphérique série (/ dev / ttyUSB0) avec B38400

int port = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
tcgetattr(port,&g_initialAtt);// save this to restore later
newAtt=g_initialAtt;
newAtt.c_cflag = B38400 | CS8 | CLOCAL | CREAD; 
cfmakeraw(&newAtt);
tcsetattr(port,TCSANOW,&newAtt);

puis exécutez:

if(ioctl(port, TIOCGSERIAL, &sstruct) < 0){
    printf("Error: could not get comm ioctl\n"); 
    exit(0); 
}
sstruct.custom_divisor = custDiv;
//sstruct.flags &= 0xffff ^ ASYNC_SPD_MASK; NO! makes read fail.
sstruct.flags |= ASYNC_SPD_CUST; 
if(ioctl(port, TIOCSSERIAL, &sstruct) < 0){
    printf("Error: could not set custom comm baud divisor\n"); 
    exit(0); 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top