在Win32中更改串行端口波特率而不进行传输

问题描述 投票:0回答:1

我是串行编程的新手,正在尝试制作一个通过串行端口将字节发送到Arduino的程序,以控制LED阵列。为了提高效率,我想使用Windows API在C ++中以高波特率执行此操作。这是我的最小示例,该示例仅发送“ 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中是否可以在进行更改时临时关闭端口?这应该可行,因为可以使用pySerial在Python中轻松完成:

from serial import Serial
s = Serial("/COM5")
s.close()
s.baudrate = 18400
s.open()
s.write([1])
c++ winapi arduino serial-port
1个回答
0
投票

SetCommState不应将任何数据发送到端口。但是,如果尝试更改/设置DCB的某些值,则应从端口获取数据(使用GetCommState),更改所需的值,然后设置新的dcb。

此处有更多信息:https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommstate请参阅“备注”部分。

© www.soinside.com 2019 - 2024. All rights reserved.