【发布时间】: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