Связь с прибором по СОМ порту
От: 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_
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.