Связь с прибором по СОМ порту
От: WM  
Дата: 19.03.03 09:44
Оценка:
Подскажите плз.

Программа (на С Builder 4.0) осуществляет связь с прибором по СОМ порту и читает из него данные ( ~8 Mb). Для чтения используется API функция ReadFile (port, buff, 1, &ntake,0).
Прибор исправен и предаёт данные (проверено).
Программа начинает читать данные, но через некоторое время «затыкается».
Однако данные (посредством ReadFile) из порта не читаются т.е. ntake=0 и buff пуст. Вызов функции ClearCommError (port, lpErr, lpStaff) показывает, что данные в буфере есть.
Прибор предаёт порциями 64b, в конце которой стоит контрольная сумма (2b), ПК её подтверждает и т.д.
Затыкается не сразу, а на 1-2 Мб.
Менялись таймауты на чтение,и время задержки.

Кто-нибудь сталкивался с такой проблемой????


ниже кусок кода

int TFMain::ReadOneRecord(char *buf,long len)
{
BYTE pSum1,pSum2;

// String scn;

int count = 0;
int controlK = 0;
while (true) {
ClearCommError(port,lpErrors,lpStat);
// DWORD kkk = lpStat->cbInQue;
ReadFile(port,&buf[count],1,&ntake,NULL);

// control << count << " " << Gcount << " " << kkk << endl;

if (ntake > 0)
count++;
else
controlK++;
if (count == len) {
Gcount = Gcount + len - 2; // это для отбражения
break;
}
if (controlK > 2000)
return 16; // нет данных
}

CRCFletcher(len-2,buf,pSum1,pSum2); // подсчет контрольной суммы
BYTE c1 = buf[len-2];
BYTE c2 = buf[len-1];

// scn = "Контрольная сумма";
// control << scn.c_str() << " " << pSum1 << " " << pSum2 << " " <<
// c1 << " " << c2 << endl;

if ((c1 == pSum1) && (c2 == pSum2)) { // контрольная сумма совпала
WriteFile(port,"Ok",2,&nsend,NULL);
// Memo1->Lines->Add("Ok"); мой комментарий
return 1;
}
else { // контрольная сумма не совпала
WriteFile(port,"No",2,&nsend,NULL);
Memo1->Lines->Add("No");
return 0;
}
}
//-------------------------------------------------------------------



19.03.03 13:47: Перенесено модератором из 'Коллеги, улыбнитесь' — _MM_
Re: Связь с прибором по СОМ порту
От: serjhp  
Дата: 19.03.03 11:41
Оценка:
Здравствуйте, WM, Вы писали:

WM>Подскажите плз.

Я не спец по билдеру (немного на С, пишу проги по обмену с портом на делфях).
У тебя получается (как я понял) распределенный массив buf , т.е. сколько нужно место столько и займет, и не получаеться так что у тебя не хватает в памяти места?
Как именно затыкаеться?
Re[2]: Связь с прибором по СОМ порту
От: WM  
Дата: 19.03.03 13:29
Оценка:
Здравствуйте, serjhp, Вы писали:

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


WM>>Подскажите плз.

S>Я не спец по билдеру (немного на С, пишу проги по обмену с портом на делфях).
S>У тебя получается (как я понял) распределенный массив buf , т.е. сколько нужно место столько и займет, и не получаеться так что у тебя не хватает в памяти места?
S>Как именно затыкаеться?

Это не проблемма с памятью.
Виснет следующим образом:
— системный буфер, связанный с портом, информацию имеет, однако при считывании считывается ноль байт.
Такие дела
Re[3]: Связь с прибором по СОМ порту
От: serjhp  
Дата: 19.03.03 13:56
Оценка:
Здравствуйте, WM, Вы писали:

WM>Это не проблемма с памятью.

WM>Виснет следующим образом:
WM>- системный буфер, связанный с портом, информацию имеет, однако при считывании считывается ноль байт.
WM>Такие дела
Попробуй побайтно принимать примерно вот так:
(на Делфях)

while(Status.CbInQue<>0) do
 begin
  ReadFile(HComm,B,1,BytesToRead,nil);
  Buffer[CPosition]:=B[0];
 end;
Re: Связь с прибором по СОМ порту
От: Forint Украина  
Дата: 20.03.03 12:08
Оценка:
1.Не совсем ясно, почему читаеш из порта по 1 байту? Если прибор отсылает по 64К, так и читай по 64! Скорее всего после этого проблема исчезнет.
2. Перед каждой операцией чтения попробуй использовать PurgeComm(PortHandle,PURGE_RXCLEAR);
3. Возможно,становка происходит в следствие потери синхронизации.
4. Если преред каждым пакетом прибор ожидает запроса — поставь небольшую задержку между пакетами.
5. Каким образом в устройстве реализован интерфейс RS-232?
6. Небольшой совет напоследок — читай данные из порта в отдельном потоке.
... << RSDN@Home 1.0 beta 6a >>
Re: Связь с прибором по СОМ порту
От: Forint Украина  
Дата: 20.03.03 12:11
Оценка:
И ещё,, очень рекомендую програмку PortMon. В таких ситуациях очень выручает.
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.