Изменение скорости передачи последовательного порта в Win32 без передачи - PullRequest
0 голосов
/ 26 января 2020

Я новичок в последовательном программировании и пытаюсь создать программу, которая отправляет байты через последовательный порт на Arduino для управления светодиодной матрицей. Для эффективности я хочу сделать это в C ++, используя Windows API, с высокой скоростью передачи данных. Вот мой минимальный пример, который просто отправляет '1':

#include <windows.h>

DCB serialParams;
byte data[1];
DWORD bytessent;

int main(int argc, char* argv[])
{
    data[0] = 1;

    HANDLE arduino = CreateFile("/COM5", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    serialParams.BaudRate = CBR_19200;
    serialParams.ByteSize = 8;
    serialParams.StopBits = ONESTOPBIT;
    serialParams.Parity = NOPARITY;
    SetCommState(arduino, &serialParams);

    WriteFile(arduino, &data, 1, &bytessent, 0);
    return 0;
}

Это работает хорошо, за исключением того, что вызов функции SetCommState, похоже, отправляет целую загрузку случайных данных в порт, что является головной болью, чтобы попытаться сортировать из фактических данных, поступающих. Есть ли способ в Windows API временно закрыть порт при внесении изменений? Это должно быть возможно, поскольку это может быть сделано довольно просто в Python с pySerial:

from serial import Serial
s = Serial("/COM5")
s.close()
s.baudrate = 18400
s.open()
s.write([1])

1 Ответ

1 голос
/ 26 января 2020

SetCommState не должен отправлять данные в порт. Но если вы попытаетесь изменить / установить некоторые значения DCB, вы должны получить данные из порта (используйте GetCommState), изменить нужные значения и установить новый dcb.

Дополнительная информация здесь: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommstate См. Раздел «Замечания».

...