Com порт - скорость, настройки
От: ms_odin  
Дата: 11.05.05 13:07
Оценка:
Доброго времени суток!
Подскажите, плиз, в каком направлении искать:
система: ASPLinux10, работа на ноутбуке-> com-порта в чистом виде нет, зато есть примочка USB->RS232 фирмы (?) ftdi.
Открытие происходит без ошибок:
int fd = open("/dev/ttyUSB0",O_RDWR);

При записи тоже все происходит нормально:
int wr_err = write(fd, buf, buf_size);

Проблема возникла в следующем- com-порт по умолчанию работает на скорости 9600. А вот как выставить другую, скажем 115200 Кбит/с? Интуитивно (может неправильно?) догадываюсь, что через
ioctl();

но вот какие параметры передавать — не очень ясно
Нашел исходник драйвера моего девайса: ftdi_sio.c и .h, соответственно. Однако там особо понятного не нашел, за исключением, пожалуй:
* The logic involved in setting the baudrate can be cleanly split in 3 steps.
* Obtaining the actual baud rate is a little tricky since unix traditionally
* somehow ignored the possibility to set non-standard baud rates.
* 1. Standard baud rates are set in tty->termios->c_cflag
* 2. If these are not enough, you can set any speed using alt_speed as follows:
* — set tty->termios->c_cflag speed to B38400
* — set your real speed in tty->alt_speed; it gets ignored when
* alt_speed==0, (or)
* — call TIOCSSERIAL ioctl with (struct serial_struct) set as follows:
* flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP], this just
* sets alt_speed to (HI: 57600, VHI: 115200, SHI: 230400, WARP: 460800)
* ** Steps 1, 2 are done courtesy of tty_get_baud_rate
* 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
Соответственно, прошу подсказать, как вот это все безобразие реализовать?
Заранее благодарен.
Re: Com порт - скорость, настройки
От: dottedmag Мальта http://dottedmag.net/
Дата: 11.05.05 13:10
Оценка:
Здравствуйте, ms_odin, Вы писали:

_>Проблема возникла в следующем- com-порт по умолчанию работает на скорости 9600. А вот как выставить другую, скажем 115200 Кбит/с?


(skip)

_> * The logic involved in setting the baudrate can be cleanly split in 3 steps.

_> * Obtaining the actual baud rate is a little tricky since unix traditionally
_> * somehow ignored the possibility to set non-standard baud rates.
_> * 1. Standard baud rates are set in tty->termios->c_cflag

Смотри соответствующие маны для termios. 115200 — это 'standard baud rate'.
Re[2]: Com порт - скорость, настройки
От: ms_odin  
Дата: 12.05.05 08:06
Оценка:
Здравствуйте, dottedmag, Вы писали:

D>Смотри соответствующие маны для termios. 115200 — это 'standard baud rate'.


Внимательно изучил маны для termios. Как всегда, вопросов только прибавилось.
//Думается, что орешник ждет, но:
нашел подходящую процедуру
int cfsetospeed(struct termios *termios_p, speed_t speed);

, устанавливающую скорость вывода. С константой speed вроде ясно- список приведен в мане.
А вот как получить указатель на структуру termios моего ttyUSB0 — затрудняюсь.
Re[3]: Com порт - скорость, настройки
От: dottedmag Мальта http://dottedmag.net/
Дата: 13.05.05 01:11
Оценка:
Здравствуйте, ms_odin, Вы писали:

_>А вот как получить указатель на структуру termios моего ttyUSB0 — затрудняюсь.


tcgetattr?
Re[4]: Com порт - скорость, настройки
От: ms_odin  
Дата: 13.05.05 12:11
Оценка:
Здравствуйте, dottedmag, Вы писали:

D>tcgetattr?


Большое спасибо, действительно, последовательность
tcgetattr
tcsetispeed
tcsetattr
сработала и весь поддерживаемый ряд скоростей устанавливается.
Но вот целый день бьюсь теперь со следующей проблемой:
программа компилируется без ошибок, но во время выполнения, при попытке считать данные "зависает". Причину установить не удается.
Читать пытаюсь командой
int read_try = read(fd, *buf, counter);
if (read_try==-1)
  {
   printf("Erorr");
  //...
   }
else
   {
   printf("OK");
   //...
   }


Но вот на этом происходит "зависание", не выводится ничего. При этом данные на вход RS232 фактически посылаются (проверяли).
На всякий случай установил флаг

p_termios->c_cflag &= CREAD;


Там в мане написано, что константа CREAD для флага c_cflag — разрешение чтения.
В чем может быть проблема?
Заранее благодарен
Re[5]: Com порт - скорость, настройки
От: dottedmag Мальта http://dottedmag.net/
Дата: 13.05.05 16:43
Оценка:
Здравствуйте, ms_odin, Вы писали:

_>программа компилируется без ошибок, но во время выполнения, при попытке считать данные "зависает". Причину установить не удается.

_>Читать пытаюсь командой
_>
_>int read_try = read(fd, *buf, counter);

А здесь в counter сколько места? read вполне может захотеть заполнить себе весь буфер перед возвратом управления.

_>if (read_try==-1)
_>  {
_>   printf("Erorr");
_>  //...
_>   }
_>else
_>   {
_>   printf("OK");
_>   //...
_>   }
_>


Больше помочь ничем не могу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.