Операции с перекрытием последовательного порта возвращают код 87 (ERROR_INVALID_PARAMETER)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Операции с перекрытием последовательного порта возвращают код 87 (ERROR_INVALID_PARAMETER)

Сообщение Anonymous »

Я пытаюсь установить связь с Arduino nano.
Я изучаю возможность использования перекрывающегося ввода-вывода, это всего лишь тест, и я знаю, что меня не интересует использование перекрывающегося ввода-вывода в этом состоянии.
Я использую 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»