c++ - 在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])
解决方案
SetCommState 不应向端口发送任何数据。但是,如果您尝试更改/设置 DCB 的某些值,您应该从端口获取数据(使用 GetCommState),更改所需的值,然后设置新的 dcb。
更多信息在这里:https ://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommstate 请参阅“备注”部分。
推荐阅读
- javascript - 如何与承诺一起使用 withLatestFrom?
- spring-batch - 所有块项目处理器的 Spring 批处理列表
- sql - 如何对 last_transaction amout 为 500 的每个帐户的最后一笔交易进行 SQL 查询?
- c# - 如何获取 Nunit 测试的执行时间,包括设置时间?
- ios - 如何更改 UIAlertAction 标题的颜色
- unity3d - 适用于 Android 64 位的 Unity Release 构建错误
- c - 如何使用 C 将字符串数组存储在文件中(每行一个字符串)?
- laravel - Laravel 8:在新 Laravel 项目上运行 Artisan Migrate 时出错
- layout - SwiftUI:ScrollView 中 GeometryReader 中视图的高度和间距
- java - 当服务器使用 jar 文件运行时,它会给出 curl: (52) Empty reply from server