Re[3]: как организовать асинхронную работу через rs-232?
От: Sergey Россия  
Дата: 26.11.03 10:28
Оценка:
Hello, EandG!
You wrote on Tue, 25 Nov 2003 17:18:49 GMT:

E> Абсолютно верное замечание — параметров конечно 5 — код такой


E> WriteFile(port, ask, dwToWrite, &dwWritten, NULL);

E> ReadFile(port, reply, expectLengthOfLine, &dwRead, NULL);

Ну так что с dwRead дальше делаешь? Всегда ли оно совпадает с expectLengthOfLine?

E> а проект могу хоть весь прислать


Не надо.

E> — там вначале письма еще опечатка — послед. порт а паралелльный —


Насчет параллельного не понял.


S>> Можно, но вряд ли необходимо.


E> если знаете как, то если это долго рассказывать то я готов хоть

Ну там просто вариантов возможна целая куча.

E> позвонить потому что когда то была похожая проблема с сокетами и после

E> использования асинхронных сокетов все проблемы исчезли

Да примерно так же, как с сокетами. Наверно проще всего будет так — запускаешь отдельный поток, делаешь в нем буфер на 12 байт (или какая там у тебя длина посылки), пишешь полученные байты в буфер, как буфер заполнился — декодируешь ответ и передаешь его главному потоку. Если посылки переменной длины, буфер удобнее всего делать кольцевой. Количество байт, доступных для чтения, берешь не из expectLengthOfLine, а смотришь, сколько байт сидят во входной очереди с помощью ClearCommError и ровно столько читаешь (не помню, почему я именно так делал — но работало безупречно).

E> но если можете подсказать и решение без "асинхронности" то

E> признательность будет не меньшей — пока не понятен даже механизм почему
E> пропадают байты при приеме и особенно часто первый байт — если на компе
E> вертится что то еще особенно лазаине по инет

E> Прога работает сутками если она на компе одна — но если полазить вовремя

E> ее работы по инет то заставить прогу потерять байты при приеме можно за
E> минуту

Ну пока предположение такое — dwRead возвращает меньше, чем expectLengthOfLine, поскольку на загруженной машине посылки начинают приходить кусками. Ну и ошибки всяческие проверять не помешает — перед каждым чтением и записью в порт. При frame error порт закрыть/открыть.

Best regards,
Sergey.
Posted via RSDN NNTP Server 1.8 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.