WaitCommEvent не возвращается при запуске (работает, когда COMPort инициализируется через MatLAB)

У меня возникла странная проблема, связанная с WaitCommEvent.
Я открываю последовательный порт через C ++, используя CreateFile.
Когда я хочу получить что-то от него, WaitCommEvent не отвечает, и программа падает.
НО: если я инициализировал тот же порт с помощью MatLAB, а затем попытался открыть его с помощью моего файла C ++, он прекрасно работал.
К сожалению, я не смог найти решение в других сообщениях.
Буду очень признателен за любые предложения. Заранее спасибо.

Это мой C ++ CODE (значения для comport и baudrate правильные и такие же, как в коде matlab):

m_hLaunchpad = CreateFile(COMPORT_LAUNCHPAD, GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);

unsigned char buffer[64];
DCB dcb;
DWORD dwBytesTransferred;
DWORD dwCommModemStatus;
if (m_hLaunchpad == INVALID_HANDLE_VALUE)
{
return (C_ERROR);
}

if (!GetCommState(m_hLaunchpad, &dcb))
return (C_ERROR);
dcb.BaudRate = BAUD_LAUNCHPAD; //baudrate;
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop
if (!SetCommState(m_hLaunchpad, &dcb))
return (C_ERROR);
SetCommMask(m_hLaunchpad, EV_RXCHAR | EV_ERR); //receive character event
WaitCommEvent(m_hLaunchpad, &dwCommModemStatus, NULL); //wait for character

if (dwCommModemStatus & EV_RXCHAR)
ReadFile(m_hLaunchpad, &buffer, sizeof(buffer), &dwBytesTransferred, 0); // read and save in buffer
else if (dwCommModemStatus & EV_ERR)
return (C_ERROR);

Вот как инициализируется Comport через MatLAB:

% LaunchPad for potentiometers
handles.ser2 = serial(handles.COMPort2, 'BaudRate', 115200);
handles.ser2.BytesAvailableFcnCount = 64;
handles.ser2.BytesAvailableFcnMode = 'byte';
handles.ser2.BytesAvailableFcn = {@instrcallback, hObject};

Больше информации: я использую Maestro и Launchpad. Открытие порта и отправка данных в порт Maestro прекрасно работает при запуске и после выполнения кода Matlab, поэтому только получение с панели запуска вызывает проблемы.

0

Решение

Вот и я наконец нашел решение.
Это не имело ничего общего с асинхронным рукопожатием или рукопожатием.

Чтобы установить скорость передачи данных, я использовал BAUD_115200 (из WinBase.h), и, похоже, это неправильно.
Я добавил Baudrate как int (115200) вместо использования переменной, и теперь она работает. Я ничего не изменил в коде.
Для Mini Maestro переменная BAUD_9600 работает, хотя.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector