Есть ли способ получить поддерживаемые скорости передачи в C?

У меня есть приложение, которое разговаривает между ПК и платой с микроконтроллером, работающим под управлением uCLinux. Когда я отправляю сообщение через /dev/TTYS0, я получаю его на стороне ПК, однако сообщение выглядит тарабарщиной. Я почти уверен, что у меня какое-то несоответствие скорости передачи.

На стороне ПК я использую предоставленную скорость передачи:

Serial<id=0x1efb320, open=True>(port='COM4', baudrate=9600, bytesize=8, parity='
N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

На стороне платы Linux я устанавливаю ту же скорость передачи в коде:

tcgetattr(fd, &options);
cfsetispeed(&options, 9600);
cfsetospeed(&options, 9600);
tcsetattr(fd, TCSANOW, &options);
tcgetattr(fd, &options);

Это сработало для меня, когда я тестировал ПК (Win 7) -> Linux Box (OpenSuse), поэтому я знаю, что теория верна. Теперь, когда я перенес это на свою истинную цель (плата микроконтроллера Coldfire, работающая под управлением uCLinux), я получаю мусор.

Итак, мой первый вариант - «угадать и проверить» при различных скоростях передачи, чтобы увидеть, смогу ли я найти тот, который будет работать, но вместо этого я хотел бы программно найти способ определения поддерживаемых скоростей передачи для конкретной цели.

Я уверен, что есть API, но я его не нашел. Идеи?

РЕДАКТИРОВАТЬ: Кажется, можно получить максимальную скорость передачи в Windows с помощью Структура COMMPROP. Есть ли что-нибудь подобное в Linux?


person Mike    schedule 16.10.2012    source источник
comment
Вы проверили, что настройки последовательного порта по умолчанию в вашем окне uClinux имеют тот же размер байта, четность и стоповые биты, что и ПК? В таком случае вам также следует установить эти параметры. Я тоже работаю с uClinux для Coldfire, и я не обнаружил проблем с использованием последовательного драйвера по умолчанию ... Также помните, что у меня нет конфликтов с системной консолью. Я имею в виду, что на моей плате / dev / ttyS0 используется системной оболочкой как стандартный вывод.   -  person Claudix    schedule 16.10.2012
comment
Скорость передачи данных вряд ли будет проблемой. Почти весь мир поддерживает 9600 бод. Гораздо более вероятно, что это ошибка в вашем коде uC или данных конфигурации.   -  person Martin James    schedule 16.10.2012
comment
@Claudix - Где я могу проверить эти параметры?   -  person Mike    schedule 16.10.2012
comment
@MartinJames - Тем не менее, вопрос все еще остается в силе. Я хотел бы иметь возможность добавить это в качестве проверки работоспособности в начале кода. Распечатать supported baud rates are: ...   -  person Mike    schedule 16.10.2012


Ответы (1)


Прочтите справочную страницу cfsetospeed(). Параметр speed должен быть константой: B50, B75, .., B9600, B19200, B38400, B57600, B115200 или B230400, а не просто скоростью в виде числа.

Чтобы узнать, поддерживается ли конкретная скорость, просто установите ее _11 _ + _ 12_, затем прочтите настройки (используя _13 _ + _ 14_) и проверьте, установлена ​​ли скорость на желаемое значение или нет. Я считаю, что драйвер должен отклонить недопустимые скорости передачи данных.

person Nominal Animal    schedule 16.10.2012