MATLAB串口写COM端口功能对应的等效C/C++代码咨询
Windows平台等效C/C++串口实现
- 本实现1:1对齐原MATLAB代码的串口操作逻辑,无第三方库依赖,可直接通过MSVC等编译器编译运行。
- MATLAB Coder无法完成自动转换的核心原因:
serialport类属于MATLAB硬件交互模块的专属接口,无Coder可识别的原生串口驱动绑定,无法自动生成等价的硬件操作代码。
代码执行流程完全匹配原MATLAB逻辑:
- 打开COM1串口,配置9600波特率、8数据位、无校验、1停止位
- 保留CR终止符的配置逻辑(该配置仅作用于串口接收场景,纯发送操作时不会对数据流产生影响)
- 按顺序发送4组原始字节数据,首次发送完成后阻塞等待1秒
- 所有发送操作均为原始8位字节直传,无任何字符集编码转换
#include <windows.h> #include <iostream> #include <chrono> #include <thread> int main() { // 打开COM1串口,对应 serialport('COM1',9600) 初始化操作 HANDLE hSerial = CreateFileA( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hSerial == INVALID_HANDLE_VALUE) { std::cerr << "打开COM1串口失败,错误码:" << GetLastError() << std::endl; CloseHandle(hSerial); return 1; } // 配置串口核心参数 DCB dcbSerialParams = {0}; dcbSerialParams.DCBlength = sizeof(dcbSerialParams); GetCommState(hSerial, &dcbSerialParams); dcbSerialParams.BaudRate = CBR_9600; dcbSerialParams.ByteSize = 8; dcbSerialParams.StopBits = ONESTOPBIT; dcbSerialParams.Parity = NOPARITY; SetCommState(hSerial, &dcbSerialParams); // 配置串口超时参数,保证写操作可立即返回 COMMTIMEOUTS timeouts = {0}; timeouts.WriteTotalTimeoutConstant = 50; timeouts.WriteTotalTimeoutMultiplier = 10; SetCommTimeouts(hSerial, &timeouts); // 第一次发送:对应 write(s_port,char([50 01]),"char") BYTE sendBuf1[] = {50, 1}; DWORD writtenBytes; WriteFile(hSerial, sendBuf1, sizeof(sendBuf1), &writtenBytes, NULL); // 对应 pause(1) 的1秒等待 std::this_thread::sleep_for(std::chrono::seconds(1)); // 第二次发送:对应 write(s_port,char([16 2 150]),"char") BYTE sendBuf2[] = {16, 2, 150}; WriteFile(hSerial, sendBuf2, sizeof(sendBuf2), &writtenBytes, NULL); // 第三次发送:对应 write(s_port,char([55 18]),"char") BYTE sendBuf3[] = {55, 18}; WriteFile(hSerial, sendBuf3, sizeof(sendBuf3), &writtenBytes, NULL); // 第四次发送:对应 write(s_port,char(54),"char") BYTE sendBuf4[] = {54}; WriteFile(hSerial, sendBuf4, sizeof(sendBuf4), &writtenBytes, NULL); // 关闭串口 CloseHandle(hSerial); return 0; }
关键行为对齐说明
- 字节流匹配:MATLAB中
char([数值列表])的本质是将输入整数映射为对应Unicode字符,再按配置编码规则转为字节发送,本实现直接使用对应整数作为原始字节值发送,可根据实际运行时MATLAB输出的字节流微调缓冲区数值,达到完全一致的发送效果。 - 终止符逻辑匹配:
configureTerminator(s_port,'CR')仅为串口接收时的帧结束标识配置,不会在发送数据时自动追加0x0D(CR)字节,C++实现无需额外追加终止符,完全匹配MATLABwrite函数的纯字节发送逻辑。 - 时序匹配:代码中使用标准库的1秒阻塞等待,与MATLAB中
pause(1)的等待时长一致,无明显时序偏差。
内容的提问来源于stack exchange,提问作者Zachary
相关产品推荐
相关产品推荐

