首页 > 解决方案 > 在Win32中更改串口波特率而不发送

问题描述

我是串行编程的新手,正在尝试制作一个通过串行端口将字节发送到 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 中是否有办法在进行更改时暂时关闭端口?这应该是可能的,因为它可以在 Python 中使用 pySerial 轻松完成:

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

标签: c++winapiarduinoserial-port

解决方案


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

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


推荐阅读