Я пытаюсь использовать функцию readfile
для чтения данных с устройства CDC в среде WinCE.
BOOL WINAPI ReadFile(
_In_ HANDLE hFile,
_Out_ LPVOID lpBuffer,
_In_ DWORD nNumberOfBytesToRead,
_Out_opt_ LPDWORD lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
Я хотел бы знать, каков предел размера для readbuf
. Я отправляю блок из 256 байтов данных в 100 раз, параметр lpNumberOfBytesRead
из ReadFile
возвращает 173 байта с первой попытки, а 0 - все остальные 99 раз. Пожалуйста, дайте мне знать, что мне не хватает. Также каков размер лимита для "writebuf"? ниже приведен код для открытия порта
BOOL PortOpen()
{
Close();
ComPort = INVALID_HANDLE_VALUE;
COMMTIMEOUTS ct;
ComPort=CreateFile (TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (ComPort != INVALID_HANDLE_VALUE) {
dcb.DCBlength = sizeof (dcb);
GetCommState (hLocal, &dcb);
dcb.BaudRate = 115200;
dcb.fParity = FALSE;
dcb.fNull = FALSE;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8;
SetCommState (ComPort, &dcb);
ct.ReadIntervalTimeout = 0;
ct.ReadTotalTimeoutMultiplier = 0;
ct.ReadTotalTimeoutConstant = 0;
ct.WriteTotalTimeoutMultiplier = 0;
ct.WriteTotalTimeoutConstant = 0;
SetCommTimeouts (hLocal, &ct);
}
Liang
Спасибо за ваш ответ! моя проблема решена. WindowCE не поддерживает перекрывающиеся ввода-вывода, чтение и запись должны быть в отделенном потоке. Кроме того, чтобы избежать состояния гонки, я использовал семафор.
Liang
Тайм-ауты для операции ReadFile можно настроить с помощью API SetCommTimeouts, вы уверены, что ваш код не вызывает его? В этом случае количество возвращаемых байтов может меняться в зависимости от разных заданных параметров таймаута.