C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
И снова RS232
SUA
Отправлено: 01.03.2007, 04:17


Ученик-кочегар

Группа: Участник
Сообщений: 3



Чтение хелпов и статей не вразумило!
Читаю СОМ порт функцией ReadFile в асинхронном режиме. В ней указывается количество байтов ожидаемых для чтения. Всё было хорошо, пока размер массива для чтения не стал меняться. Получается, что если пишу цифру менее размера, то теряю часть информации. Если укажу цифру больше массива, то видимо функция пытаясь это каличество прочитать вообще теряет всё.
Как решается вопрос с приёмом неопределённого размера байт?
В попавшихся примерах указываются конкретные цифры.
bred
Отправлено: 01.03.2007, 11:06


Ученик-кочегар

Группа: Участник
Сообщений: 15



Попробуй выяснять сколько насыпалось в буфер и вычитывать это число. Но есть шанс получать переполнение буфера и потеря информации уже из-за этого. wink.gif
SUA
Отправлено: 02.03.2007, 03:32


Ученик-кочегар

Группа: Участник
Сообщений: 3



Переполнение наверное не получится, потому как прибор отвечает по запросу, и до следующего запроса будет молчать.
Первая мысль такая и была, узнать сколько прибыло, но не умею?
Как?
bred
Отправлено: 02.03.2007, 10:10


Ученик-кочегар

Группа: Участник
Сообщений: 15



Тогда вообще странно, по идее, исходя из запроса должно быть известно сколько данных должно придти в ответ. Ну да ладно, это что называется ваши заморочки с протоколами. а получить можно вот так:
CODE
COMSTAT CStat; // структура возвращает информацию о текущем
  // состоянии последовательного порта, заполняется
  // при вызове функции ClearCommError()
  // члены структуры:
  // ----------------
  // DWORD fCtsHold : 1;
  // DWORD fDsrHold : 1;
  // DWORD fRlsdHold : 1;
  // DWORD fXoffHold : 1;
  // DWORD fXoffSent : 1;
  // DWORD fEof : 1;
  // DWORD fTxim : 1;
  // DWORD fReserved : 25;
  // DWORD cbInQue;
  // DWORD cbOutQue;
ClearCommError(hCom, &ErrorMask, &CStat);
DWORD quelen = CStat.cbInQue; // quelen содержит число байт в
                                                    //  приемном буфере

А вообще вот тут работа с com-port'ом
SUA
Отправлено: 02.03.2007, 10:47


Ученик-кочегар

Группа: Участник
Сообщений: 3



Спасибо, есть информация к размышлению. С данной ClearCommError функцией не знаком. И в примерах не попадалась.
А вот ссылка не открылась.
По поводу "известно сколько данных должно придти в ответ", я тоже считал что известно. Дело в том что опрашиваю промышленный прибор и объём ответа зависит от количества запрограмированных для ответа каналов. А это количество каналов может меняться как угодно.
bred
Отправлено: 02.03.2007, 10:57


Ученик-кочегар

Группа: Участник
Сообщений: 15



Не знаю почему у вас ссылка не открылась, у меня открывается нормально. вот скопировал страничку в тхт.

User Attached Image Скачать файл
Программирование_COM_порта_с_использованием_win32API_и_assembler..txt



Вернуться в Вопросы программирования в C++Builder