Гость Опубликовано 4 января, 2005 Жалоба Опубликовано 4 января, 2005 меня есть несколько вопросов по работе с ком протами 1. как установить нестандартую скорость (100 бод)? 2. как установить 1.5 стоповых бита? Проблема в том что константы для скрости 100 бод нет есть для 110 но мне это не подходит, анологично и для стоповых битов. Флагом можно установить 2 бита или сбросить его тогда будет 1 бит, а как установить 1.5? Если есть дайте пример. Цитата
EL[michlen] Опубликовано 5 января, 2005 Жалоба Опубликовано 5 января, 2005 Цитата: как установить нестандартую скорость (100 бод)? Нормальным способом - никак. Можно использовать число вместо константы, тогда обычно работает, но многие системы округляют ее до ближайшей стандартной скорости и работают на ней, а некоторые вообще работают на скорости по-умолчанию. Это для Unix. А в Windows можно смело писать число вместо константы. Цитата: как установить 1.5 стоповых бита? Так для какой все-таки ОС? В Windows это отдельный пункт структуры DCB, а в Linux возможно использование только 2-х или 1-го стоп-бита (насколько я знаю). Я бы копал в сторону прямого доступа к портам. Это можно сделать функцией ioperm(), но для этого у пользователя должны быть права root. Альтернативный способ - использование /dev/port. Открываем файл, делаем lseek на нужный адрес (это и будет адрес порта), а читаем и пишем с помощью read и write. Но и здесь есть несколько недостатков: во-первых, пользователь должен иметь доступ к /dev/port, во вторых, этот способ несколько медленнее (хотя в случае 100 бод это не важно), а в-третьих, использование /dev/port дает доступ к любым портам системы, так что можно очень легко что-нибудь повредить. Цитата
Гость Опубликовано 18 января, 2005 Жалоба Опубликовано 18 января, 2005 пытался покопать по поводу ioperm(), inb(), outb() не могу найти по каким адресам писать данные для установки нужной скорости. ОС Linux, права у пользователя root Цитата
EL[michlen] Опубликовано 19 января, 2005 Жалоба Опубликовано 19 января, 2005 Диапазоны адресов портов: COM1: 3F8h-3FFh COM3: 338h-33Fh COM2: 2F8h-2FFh COM4: 238h-23Fh Чтобы установить скорость обмена данными, нужно установить высокий логический уровень (1) бита DLAB порта 3FBh (7-й бит): 1=порты 3F8h и 3F9h для загрузки скорости обмена; 0=порты 3F8h и 3F9h в обычном режиме. Старший байт скорости обмена пишется в порт 3F9h по принципу 115200/V, где V - скорость в бодах. Например для скорости 19200 результат равен 115200/19200=6, т.е. нужно вывести 06h в порт 3F9h. В порт 3F8h пишется младший байт скорости обмена. Не забудте сбросить бит DLAB после установки скорости =) Цитата
Гость Опубликовано 19 января, 2005 Жалоба Опубликовано 19 января, 2005 Большое спасибо за помощь все получилось только у Вас опечатка >> т.е. нужно вывести 06h в порт 3F9h. 06h нужно вывести в порт 3F8h, а в порт 3F9h вывести 00h Цитата
Гость Опубликовано 20 января, 2005 Жалоба Опубликовано 20 января, 2005 В файле /usr/src/linux-2.4.28/include/net/irda/ircomm_param.h есть строки: #define IRCOMM_1_STOP_BIT 0x00 #define IRCOMM_2_STOP_BIT 0x04 /* 1.5 if char len 5 */ То есть 1.5 можно таки выставить штатно. Я понимаю, что это для irda, но у меня нет времени искать в ядре более точную информацию, я только хочу намекнуть, что всё можно найти. Кроме того (это моё IMHO) лучше использовать ioctl, ведь вызовы есть и они определены, опускаться до ассемблера - смысла нет. Я не программист Цитата
EL[michlen] Опубликовано 20 января, 2005 Жалоба Опубликовано 20 января, 2005 Цитата: Кроме того (это моё IMHO) лучше использовать ioctl, ведь вызовы есть и они определены, опускаться до ассемблера - смысла нет. Это правильно. Но ещё нужно учитывать, что раз уж программа привязывается к конкретным адресам портов, то могут быть проблемы с переносимостью на другие архитектуры. Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.