Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с COM портом 
:(
    Опции темы
xvr
Дата 14.11.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(theworldcreator @ 13.11.2007,  19:40)
Теперь все время возвращает "134514025", не зависимо от записанного в порт значения
Пробовал использовать другие типы переменной val, и записывать/считывать большее количество байт. Тип double и чтение 8 байт выдает все время "1"; тип unsigned long int и чтение 4 байт дает то же "134514025"
Имел ввиду:
Код

unsigned long int val;
write(com, &buf, 4); 
read(com, &val, 4);

А топором ее не пробовал smile ?

1. Переменную val рекомендуется инициализировать (например нулем)
2. Убери O_NDELAY из open - у тебя порт открывается в асинхронном режиме, т.е. write возвращается когда реальные данные еще не передались, и соотвественно read'у еще нечего читать. При этом read так же возвращается немедленно (но с ошибкой), ничего не прочтя и не присваивая никаких данных в переданную ему память, т.е. в переменной val у тебя мусор.
3. Почитай какой нибудь букварь по работе с COM портом, там все не так просто :(


PM MAIL   Вверх
theworldcreator
Дата 14.11.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Букварь сейчас поищу.
Теперь(после выполнения ваших, xvr, советов) программка стопорится на чтение(я перед каждым действием поставил вывод на экран, например "Writing...", а после "OK\n") на неопределенный срок(уже минут пять висит).
PM MAIL WWW ICQ   Вверх
xvr
Дата 14.11.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(theworldcreator @ 14.11.2007,  20:54)
Букварь сейчас поищу.
Теперь(после выполнения ваших, xvr, советов) программка стопорится на чтение(я перед каждым действием поставил вывод на экран, например "Writing...", а после "OK\n") на неопределенный срок(уже минут пять висит).

И будет висеть и дальше smile Либо включено аппаратное управление потоком (в таком случае порт не будет принимать данные пока на соотвествующих линиях не будут установленны соотвествующие состояния), либо полностью выключенна буферизация (в таком случае данные пришли ДО вызова read, и были потеряны). И то и другое настраивается через ioctl (какие именно я наизусть не помню)

PM MAIL   Вверх
theworldcreator
Дата 15.11.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Блин, что то ни букваря, ни включения буферизации не могу найти:( Лучшее что обнаружил, это вот это руководство: http://www.opennet.ru/docs/RUS/serial_guide/
И вот этот кусок кода:
Код

      struct termios options;
      tcgetattr(com, &options);
      cfsetispeed(&options, B4800);
      cfsetospeed(&options, B4800);
      options.c_cflag |= CS8 | CLOCAL | CREAD;
      tcsetattr(com, TCSANOW, &options);

Но все равно не смог прочесть значение((
PM MAIL WWW ICQ   Вверх
xvr
Дата 15.11.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(theworldcreator @ 15.11.2007,  17:53)
Блин, что то ни букваря, ни включения буферизации не могу найти:( Лучшее что обнаружил, это вот это руководство: http://www.opennet.ru/docs/RUS/serial_guide/
И вот этот кусок кода:
Код

      struct termios options;
      tcgetattr(com, &options);
      cfsetispeed(&options, B4800);
      cfsetospeed(&options, B4800);
      options.c_cflag |= CS8 | CLOCAL | CREAD;
      tcsetattr(com, TCSANOW, &options);

Но все равно не смог прочесть значение((

Добавь
Код

options.c_cflag &= ~CNEW_RTSCTS;
options.c_iflag &= ~(IXON|IXOFF|IXANY);

так же можно попробовать вернуть O_NDELAY в открытие порта и добавить код
Код

fcntl(com, F_SETFL, 0);

PM MAIL   Вверх
theworldcreator
Дата 15.11.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



На строчку
Код

options.c_cflag &= ~CNEW_RTSCTS;

ругается следующим образом
Код

main.c: In function ‘main’:
main.c:25: error: ‘CNEW_RTSCTS’ undeclared (first use in this function)
main.c:25: error: (Each undeclared identifier is reported only once
main.c:25: error: for each function it appears in.)

Если ее закоментить, то компилятор молчит, но значение не читает.
PM MAIL WWW ICQ   Вверх
xvr
Дата 16.11.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(theworldcreator @ 15.11.2007,  23:45)
На строчку
Код

options.c_cflag &= ~CNEW_RTSCTS;

ругается следующим образом
Код

main.c: In function ‘main’:
main.c:25: error: ‘CNEW_RTSCTS’ undeclared (first use in this function)
main.c:25: error: (Each undeclared identifier is reported only once
main.c:25: error: for each function it appears in.)

Если ее закоментить, то компилятор молчит, но значение не читает.

А порт вообще работает (с соединенными ногами 2 и 3)? Попробуй подключиться к нему каким-нибудь терминалом и попечатай - должно быть эхо (в терминале надо выключить аппаратный handshake и эхо).
Если работает, то дай текущую версию твоего кода - будем смотреть дальше.

PM MAIL   Вверх
xvr
Дата 16.11.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(theworldcreator @ 15.11.2007,  23:45)
На строчку
Код

options.c_cflag &= ~CNEW_RTSCTS;

ругается следующим образом
Код

main.c: In function ‘main’:
main.c:25: error: ‘CNEW_RTSCTS’ undeclared (first use in this function)
main.c:25: error: (Each undeclared identifier is reported only once
main.c:25: error: for each function it appears in.)

Если ее закоментить, то компилятор молчит, но значение не читает.

Еще попробуй CRTSCTS вместо CNEW_RTSCTS

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.