Я что-то не так делаю или устройство просто не отвечает?
Как читать данные из com порта, сейчас я делаю это:
hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);
Other settings ....
DWORD dwBytesCount = 0;
unsigned char response[5] = {0};
unsigned char command[6] = {0x0A, 0xFF, 0x03, 0x20, 0x04};
command[5] = Crc8(command, 5);
printf("\ncrc-8 sum is:%d", command[5]);
if(!(WriteFile(hCom, command, 6, &dwBytesCount, NULL)) || (dwBytesCount != 6)) {
dwErrorCode = GetLastError();
printf("\nError in function WriteFile, error code:%ld, bytes write:%ld", GetLastError(), dwBytesCount);
std::cin >> input;
return false;
}
printf("\nwrite bytes is:%ld", dwBytesCount);
// DWORD dwMask;
// printf("\nWaitCommEvent");
// if(!WaitCommEvent(hCom, &dwMask, NULL)) {
// printf("\nError in function WaitCommEvent, error code:%ld", GetLastError());
// std::cin >> input;
// return false;
// }
for(int i = 0; i < 10; ++i) {
printf("\nread file");
if(!(ReadFile(hCom, response, 4, &dwBytesCount, NULL))) {
dwErrorCode = GetLastError();
printf("\nError in function ReadFile, error code:%ld, bytes read:%ld", GetLastError(), dwBytesCount);
std::cin >> input;
return false;
}
Sleep(100);
printf("\nread bytes is:%ld", dwBytesCount);
}
printf("\nread bytes is:%ld", dwBytesCount);
printf("\nreader response status is:%d", response[3]);
std::cin >> input;
Он читает ноль байтов.
Если я раскомментирую WaitCommEvent, программа зависнет.
Я пробовал версию с флагом OVERLAPPED и GetOverlappedResult после каждой операции, результат одинаков.
дополнение
Как я понимаю, он не может одновременно подключиться к COM-порту.
http://www.ms -news.net / f3608 / CreateFile-разделяемой режим-оленья кожа-работа-2057561.html
Соединение во втором потоке дает тот же результат
Другие настройки:
SetCommMask(hCom, (EV_RXCHAR | EV_RXFLAG | EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | EV_RLSD));
if(!(GetCommTimeouts(hCom, &timeout))) {
printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
std::cin >> input;
return false;
}
timeout.ReadIntervalTimeout = 50;
timeout.ReadTotalTimeoutConstant = 50;
timeout.ReadTotalTimeoutMultiplier = 10;
timeout.WriteTotalTimeoutConstant = 50;
timeout.WriteTotalTimeoutMultiplier = 10;
//timeout.ReadIntervalTimeout = 0xFFFFFFFF;
//timeout.ReadTotalTimeoutConstant = 1000;
//timeout.ReadTotalTimeoutMultiplier = 0;
//timeout.WriteTotalTimeoutConstant = 1000;
//timeout.WriteTotalTimeoutMultiplier = 0;
if(!(SetCommTimeouts(hCom, &timeout))) {
printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
std::cin >> input;
return false;
}
if(!(SetupComm(hCom, 128, 128))) {
printf("Error in function SetupComm error code:%ld", GetLastError());
std::cin >> input;
return false;
}
if(!(GetCommState(hCom, &ComDCM))) {
printf("Error in function GetCommState error code:%ld", GetLastError());
std::cin >> input;
return false;
}
ComDCM.BaudRate = 115200;
ComDCM.ByteSize = 8;
ComDCM.Parity = NOPARITY;
ComDCM.StopBits = ONESTOPBIT;
ComDCM.fAbortOnError = TRUE;
ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
ComDCM.fBinary = TRUE;
ComDCM.fParity = FALSE;
ComDCM.fInX = ComDCM.fOutX = FALSE;
ComDCM.XonChar = 0;
ComDCM.XoffChar = uint8_t(0xff);
ComDCM.fErrorChar = FALSE;
ComDCM.fNull = FALSE;
ComDCM.fOutxCtsFlow = FALSE;
ComDCM.fOutxDsrFlow = FALSE;
ComDCM.XonLim = 128;
ComDCM.XoffLim = 128;
if(!(SetCommState(hCom, &ComDCM))) {
printf("Error in function SetCommState error code:%ld", GetLastError());
std::cin >> input;
return false;
}
printf("success");
std::cin >> input;
сложение 2
Я тестировал этот код с эмулятором com-порта, и он работает, это означает, что проблема в устройстве.
Спасибо всем за ответы и помощь