Чтение-запись в COM
От: _TLS  
Дата: 04.02.04 07:01
Оценка:
Господа! Я не раз искал по этому форуму и не раз пытался воплотить в жизнь все прочитанное, но что-то не шибко помогает. Короче программулькуа моя должна читать из COM-а, анализировать эти данные, выдавать квитанции.
Для отладки я сварганил себе штучку, типа "заглушка" которая надевается на COM и соединяет его RX и TX. И вот тут начались чудеса.
Если отправлять в порт данные, и потом читать их "безхитростно" (т.е. просто через WriteFile() — ReadFile()) то правильные данные доходят через раз.
Если заморачиваться со всякими DCB, COMMTIMEOUTS и прочими — могут вобще чудеса начать твориться типа пишется все ок, а вот когда дело доходит до ReadFile комп погружается в задумчивость и чего-то усиленно ждет.
Короче если кто-нибудь когда-нибудь такими делами занимался, плз какие там могут быть хитрости?
_________________
Улыбайтесь чаще!
Re: Чтение-запись в COM
От: Alex_13  
Дата: 04.02.04 07:24
Оценка:
Здравствуйте, _TLS, Вы писали:

_TL>Если заморачиваться со всякими DCB, COMMTIMEOUTS и прочими — могут вобще чудеса начать твориться типа пишется все ок, а вот когда дело доходит до ReadFile комп погружается в задумчивость и чего-то усиленно ждет.


Очевидно ждет когда придет столько байт сколько ты указал в ReadFile()
Можно попробовать по 1 байту читать, если не знаешь длину ответа
Re: Чтение-запись в COM
От: Michael Chelnokov Украина  
Дата: 04.02.04 10:55
Оценка:
Здравствуйте, _TLS, Вы писали:

_TL>Для отладки я сварганил себе штучку, типа "заглушка" которая надевается на COM и соединяет его RX и TX. И вот тут начались чудеса.


А нельзя просто соединить нуль-модемным кабелем COM1 и COM2, чтобы избавиться от "чудес"?
Re: Чтение-запись в COM
От: Аноним  
Дата: 04.02.04 11:51
Оценка:
Да все нормально работает!Причем именно с внешней заглушкой, много раз пробовал.
Re[2]: Чтение-запись в COM
От: _TLS  
Дата: 04.02.04 12:22
Оценка:
Здравствуйте, Alex_13, Вы писали:

A_>Очевидно ждет когда придет столько байт сколько ты указал в ReadFile()

A_>Можно попробовать по 1 байту читать, если не знаешь длину ответа

Так как же не знаю, сам себе ведь все шлю
_________________
Улыбайтесь чаще!
Re[3]: Чтение-запись в COM
От: Аноним  
Дата: 04.02.04 12:34
Оценка:
Здравствуйте, _TLS, Вы писали:

_TL>Здравствуйте, Alex_13, Вы писали:


A_>>Очевидно ждет когда придет столько байт сколько ты указал в ReadFile()

A_>>Можно попробовать по 1 байту читать, если не знаешь длину ответа

_TL>Так как же не знаю, сам себе ведь все шлю


Да это вообще неважно сколько хочешь прочитать! Установите правильно таймауты и оно быдет вываливаться из реад по таймауту, даже если не все пришло.
Re: Чтение-запись в COM
От: avbochagov Россия  
Дата: 04.02.04 12:39
Оценка:
Здравствуйте, _TLS, Вы писали:

_TL>Для отладки я сварганил себе штучку, типа "заглушка" которая надевается на COM и соединяет его RX и TX. И вот тут начались чудеса.


Надеюсь у вас есть в этой заглущке еще две перемычки?

Для работы заглушки недостаточно только соединить RX и TX. Какие ноги еще закоротить — легко найти поиском по реализации нуль-модемного кабеля.
Я просто не помню.
... << RSDN@Home 1.1.3 beta 1 >>
Re[2]: Чтение-запись в COM
От: Аноним  
Дата: 04.02.04 12:44
Оценка:
Здравствуйте, avbochagov, Вы писали:

A>Надеюсь у вас есть в этой заглущке еще две перемычки?


A>Для работы заглушки недостаточно только соединить RX и TX. Какие ноги еще закоротить — легко найти поиском по реализации нуль-модемного кабеля.

A>Я просто не помню.

Это не так!Эти перемычки надо ставить только если включен аппаратный контроль передачи!
Re[3]: Чтение-запись в COM
От: avbochagov Россия  
Дата: 04.02.04 13:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Это не так!Эти перемычки надо ставить только если включен аппаратный контроль передачи!


Мой опыт показывает, что под виндами эти перемычки нужны всегда.
В MS-DOS их можно было не делать.
... << RSDN@Home 1.1.3 beta 1 >>
Re[4]: Чтение-запись в COM
От: Аноним  
Дата: 04.02.04 13:12
Оценка:
Здравствуйте, avbochagov, Вы писали:

A>Мой опыт показывает, что под виндами эти перемычки нужны всегда.

A>В MS-DOS их можно было не делать.

А мой лрыт показывает что не нужно никогда, если правильно установлены поля в DCB.
А опыта работы с портами у меня не мало, занимаюсь написанием ПО которое через эти самые порты работает с контроллерами!
Встречался с другой ерундой, были проблемы с таймаутами, причем очень ентересные:
выполняешь write, а оно в ней подвисает. Сначала тоже думал что проблема все-таки с отсутствием этих перемычек, оказалось нет — пришлось поставить таймауты, хоты не предполагалось что они будут использоваться. т.е. данные должны были сразу шуровать, а они чего-то ждали, но все решилось SetCommtimeouts.

А вот еще вспомнил — у нас на работе гора оборудования которое подключается к ком-порту и терминалкой смотришь/конфигуришь уго, так вот адсолютно все подключено 3 проводами без всяких перемычек!
Re[5]: Чтение-запись в COM
От: avbochagov Россия  
Дата: 04.02.04 13:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А мой лрыт показывает что не нужно никогда, если правильно установлены поля в DCB.

А>А опыта работы с портами у меня не мало, занимаюсь написанием ПО которое через эти самые порты работает с контроллерами!

Значит, все таки зависит от программы. А я грешил на перемычки
... << RSDN@Home 1.1.3 beta 1 >>
Re: Кстати...
От: _TLS  
Дата: 04.02.04 14:15
Оценка:
Такой вот вопрос. У СОМа 2 буффера (вход/выход) или один? И нужна ли OVERLAPPED структура для чтения?

СПСБ.
_________________
Улыбайтесь чаще!
Re[2]: Кстати...
От: Аноним  
Дата: 04.02.04 14:31
Оценка:
Здравствуйте, _TLS, Вы писали:

_TL>Такой вот вопрос. У СОМа 2 буффера (вход/выход) или один? И нужна ли OVERLAPPED структура для чтения?


_TL>СПСБ.


Два программных, можно даже их размеры задать.
Два аппартных, размеры зависят от чипа.
Я не использовал OVERLAPPED, просто блокирующие вызовы.
Обмен полу-дуплекс, т.е. я посылаю запрос, мне отвечают.
Если нужен полный дуплекс, то тогда или OVERLAPPED и WaitCommEvent или 2 потока — один на чтение, другой на запись.
Реально делают и так и так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.