Господа! Я не раз искал по этому форуму и не раз пытался воплотить в жизнь все прочитанное, но что-то не шибко помогает. Короче программулькуа моя должна читать из COM-а, анализировать эти данные, выдавать квитанции.
Для отладки я сварганил себе штучку, типа "заглушка" которая надевается на COM и соединяет его RX и TX. И вот тут начались чудеса.
Если отправлять в порт данные, и потом читать их "безхитростно" (т.е. просто через WriteFile() — ReadFile()) то правильные данные доходят через раз.
Если заморачиваться со всякими DCB, COMMTIMEOUTS и прочими — могут вобще чудеса начать твориться типа пишется все ок, а вот когда дело доходит до ReadFile комп погружается в задумчивость и чего-то усиленно ждет.
Короче если кто-нибудь когда-нибудь такими делами занимался, плз какие там могут быть хитрости?
Здравствуйте, _TLS, Вы писали:
_TL>Если заморачиваться со всякими DCB, COMMTIMEOUTS и прочими — могут вобще чудеса начать твориться типа пишется все ок, а вот когда дело доходит до ReadFile комп погружается в задумчивость и чего-то усиленно ждет.
Очевидно ждет когда придет столько байт сколько ты указал в ReadFile()
Можно попробовать по 1 байту читать, если не знаешь длину ответа
Здравствуйте, _TLS, Вы писали:
_TL>Для отладки я сварганил себе штучку, типа "заглушка" которая надевается на COM и соединяет его RX и TX. И вот тут начались чудеса.
А нельзя просто соединить нуль-модемным кабелем COM1 и COM2, чтобы избавиться от "чудес"?
Re: Чтение-запись в COM
От:
Аноним
Дата:
04.02.04 11:51
Оценка:
Да все нормально работает!Причем именно с внешней заглушкой, много раз пробовал.
Здравствуйте, Alex_13, Вы писали:
A_>Очевидно ждет когда придет столько байт сколько ты указал в ReadFile() A_>Можно попробовать по 1 байту читать, если не знаешь длину ответа
Так как же не знаю, сам себе ведь все шлю
_________________
Улыбайтесь чаще!
Re[3]: Чтение-запись в COM
От:
Аноним
Дата:
04.02.04 12:34
Оценка:
Здравствуйте, _TLS, Вы писали:
_TL>Здравствуйте, Alex_13, Вы писали:
A_>>Очевидно ждет когда придет столько байт сколько ты указал в ReadFile() A_>>Можно попробовать по 1 байту читать, если не знаешь длину ответа
_TL>Так как же не знаю, сам себе ведь все шлю
Да это вообще неважно сколько хочешь прочитать! Установите правильно таймауты и оно быдет вываливаться из реад по таймауту, даже если не все пришло.
Здравствуйте, _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>Я просто не помню.
Это не так!Эти перемычки надо ставить только если включен аппаратный контроль передачи!
Здравствуйте, <Аноним>, Вы писали:
А>Это не так!Эти перемычки надо ставить только если включен аппаратный контроль передачи!
Мой опыт показывает, что под виндами эти перемычки нужны всегда.
В 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 проводами без всяких перемычек!
Здравствуйте, <Аноним>, Вы писали:
А>А мой лрыт показывает что не нужно никогда, если правильно установлены поля в DCB. А>А опыта работы с портами у меня не мало, занимаюсь написанием ПО которое через эти самые порты работает с контроллерами!
Значит, все таки зависит от программы. А я грешил на перемычки
Такой вот вопрос. У СОМа 2 буффера (вход/выход) или один? И нужна ли OVERLAPPED структура для чтения?
СПСБ.
_________________
Улыбайтесь чаще!
Re[2]: Кстати...
От:
Аноним
Дата:
04.02.04 14:31
Оценка:
Здравствуйте, _TLS, Вы писали:
_TL>Такой вот вопрос. У СОМа 2 буффера (вход/выход) или один? И нужна ли OVERLAPPED структура для чтения?
_TL>СПСБ.
Два программных, можно даже их размеры задать.
Два аппартных, размеры зависят от чипа.
Я не использовал OVERLAPPED, просто блокирующие вызовы.
Обмен полу-дуплекс, т.е. я посылаю запрос, мне отвечают.
Если нужен полный дуплекс, то тогда или OVERLAPPED и WaitCommEvent или 2 потока — один на чтение, другой на запись.
Реально делают и так и так.