Я изучаю возможность использования перекрывающегося ввода-вывода, это всего лишь тест, и я знаю, что меня не интересует использование перекрывающегося ввода-вывода в этом состоянии.
Я использую Arduino nano, который каждую секунду отправляет символ («p») с помощью Serial.print.
Я вызываю WaitCommEvent в цикле.
Моя проблема: если я удалю вызов Sleep до WaitCommEvent, символ, отправленный Arduino, больше не отображается.
Вот краткое описание того, как работает мой код:
- Откройте коммуникационный порт, вызвав CreateFile с помощью Флаг FILE_FLAG_OVERLAPPED.
- Вызовите setCommMask, setCommTimeout
- Создайте соответствующее событие в перекрывающейся структуре
- Вызовите WaitCommEvent с перекрывающейся структурой.
- Затем WaitForSingleObject для этого события.
- ReadFile при сигнале о событии.
Код: Выделить всё
BOOL Status; // Status
// Defining COM port id
const wchar_t PortNo[20] = L"\\\\.\\COM4";
//Open the serial com port
HANDLE hComm; // Handle to the Serial port
printf("Opening %ls\n", PortNo);
hComm = CreateFile(PortNo, //friendly name
GENERIC_READ | GENERIC_WRITE, // Read/Write Access
0, // No Sharing, ports cant be shared
NULL, // No Security
OPEN_EXISTING, // Open existing port only
FILE_FLAG_OVERLAPPED, // Non Overlapped I/O
NULL); // Null for Comm Devices
if (hComm == INVALID_HANDLE_VALUE)
{
printf_s("\n Port %ls can't be opened\n\n", PortNo);
}
//Setting the Parameters for the SerialPort
DCB dcbSerialParams = { 0 }; // Initializing DCB structure
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
Status = GetCommState(hComm, &dcbSerialParams); //retreives the current settings
dcbSerialParams.BaudRate = CBR_9600; //BaudRate = 9600
dcbSerialParams.ByteSize = 8; //ByteSize = 8
dcbSerialParams.StopBits = ONESTOPBIT; //StopBits = 1
dcbSerialParams.Parity = NOPARITY; //Parity = None
Status = SetCommState(hComm, &dcbSerialParams);
EXIT_ON_ERROR(Status, __LINE__);
//Setting Timeouts
COMMTIMEOUTS timeouts = { 0 }; //Initializing timeouts structure
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (SetCommTimeouts(hComm, &timeouts) == FALSE)
{
printf_s("\nError to Setting Time outs");
CloseHandle(hComm);
}
DWORD BytesWritten = 0; // No of bytes written to the port
DWORD dwEventMask; // Event mask to trigger
DWORD NoBytesRead; // Bytes read by ReadFile()
int index = 0;
OVERLAPPED o = { 0 };
o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (o.hEvent == NULL)
return FALSE; // Error creating overlapped event handle.
assert(o.hEvent);
DWORD dwRes;
while (1) {
Status = SetCommMask(hComm, EV_RXCHAR);
if (Status == FALSE)
{
printf_s("\nError to in Setting CommMask\n\n");
CloseHandle(hComm);
}
//Setting WaitComm() Event
char ReadData[100] = { 0 }; //temporary Character
Status = WaitCommEvent(hComm, &dwEventMask, &o); //Wait for the character to be received
if (GetLastError() != ERROR_IO_PENDING) {
printf("IO_NOT_PENDING %d\n", GetLastError());
}
DWORD lpModemStat;
dwRes = WaitForSingleObject(o.hEvent, INFINITE);
switch (dwRes) {
case WAIT_OBJECT_0:
if (dwEventMask & EV_RXCHAR) {
Status = ReadFile(hComm, &ReadData, sizeof(ReadData), &NoBytesRead, &o);
ResetEvent(o.hEvent);
for (int i = 0; i < 100; i++) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78835901/serial-port-overlapped-operations-returns-code-87-error-invalid-parameter[/url]
Мобильная версия