【问题标题】:Changing serial port baud rate in Win32 without transmitting在Win32中更改串口波特率而不发送
【发布时间】:2020-01-26 19:43:17
【问题描述】:

我是串行编程的新手,正在尝试制作一个通过串行端口向 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])

【问题讨论】:

  • 这是不可能的,我猜Python只是简单地发送带有默认值的另一个DCB结构。
  • 请在设备管理器COM口控制面板的端口设置中尝试19200bps。这些文章可能会有所帮助。 How to Change Baud Rate for COM Port?, Windows 7: want to change a baud rate, The mythical port settings in Windows 也许这取决于您的硬件和设备驱动程序。
  • 如何确定“SetCommState 函数似乎向端口发送了整个负载的随机数据”?从示波器上看到?或者arduino设备调用SetCommState后收到东西?
  • 您没有初始化serialParams.DCBlength 字段,所以很可能SetCommState 失败了。初始化DCBlength,调用GetCommState填写您不想更改的字段,检查SetCommState的结果代码

标签: c++ winapi arduino serial-port


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2011-07-31
    • 1970-01-01
    • 2015-06-29
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多