C++ 在windows中通过串行方式写入二进制数据

C++ 在windows中通过串行方式写入二进制数据,c++,winapi,serial-port,C++,Winapi,Serial Port,我需要通过串行端口发送二进制数据,而不会将任何字节重新解释为控制字符。我目前正在设置串行端口,如下所示: #include <windows.h> // open serial port HANDLE hSerial; hSerial = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // get serial parameters

我需要通过串行端口发送二进制数据,而不会将任何字节重新解释为控制字符。我目前正在设置串行端口,如下所示:

#include <windows.h>

// open serial port
HANDLE hSerial;
hSerial = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

// get serial parameters
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength = sizeof (dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
    cout << "error getting state\n";
    exit(0);
}

// set serial params
dcbSerialParams.BaudRate = CBR_115200;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity   = NOPARITY;
if (!SetCommState (hSerial, &dcbSerialParams)) {
    cout << "error setting parameters\n";
    exit(0);
}

// set time outs
COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 10;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 10;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts (hSerial, &timeouts)) {
    cout << "problem setting timeout values\n";
    exit(0);
} else cout << "timeouts set\n";
#包括
//打开串行端口
处理串行;
hSerial=CreateFile(“COM1”,泛型读写,0,0,打开现有,文件属性正常,0);
//获取串行参数
DCB dcbSerialParams={0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if(!GetCommState(hSerial和dcbSerialParams)){

cout我认为可能发生的情况是Linux正在检测到中断,并重置端口,或者设置了规范模式这一事实正在将其搞糟。除了您已有的设置之外,还可以尝试以下设置:

    options.c_iflag |= IGNBRK;
    options.c_iflag &= ~BRKINT;
    options.c_iflag &= ~ICRNL;
    options.c_oflag = 0;
    options.c_lflag = 0;

正如Jonathan Potter提到的,很可能您没有关闭XON/XOFF流控制。在调用
SetCommState
之前添加以下行:

dcbSerialParams.fOutX = 0;
dcbSerialParams.fInX  = 0;
您可能需要设置的其他一些字段:

dcbSerialParams.fNull = 0;
dcbSerialParams.fDtrControl = DTR_CONTROL_DISABLE;
dcbSerialParams.fRtsControl = RTS_CONTROL_DISABLE;

好吧,我想出来了,一个同事想出来了。在linux方面,在文件/etc/inittab中,我不得不注释掉这行:

T0:23:respawn:/sbin/getty -L ttymxc0 115200 vt100

这是以一种无法接收字节的方式抓取串行端口。我现在看到了预期的输出。

你能发布你为
WriteFile
所做的尝试吗?调用
WriteFile
ReadFile
没有这样的运气应该没有什么不同不是适当的问题描述。没有“二进制写入模式”,它始终是二进制的。您可能需要在另一端查找问题。您应该确保
DCB::fOutX
DCB::fInX
都设置为0。这似乎没有什么区别。不过,我的想法是一样的,一些字节被解释为控制字符。不过,它没有我发送哪个字节似乎无关紧要。我已经尝试过了,结果没有变化。我一直在考虑的一件事是:可以通过串行端口登录,事实上,这就是您首先设置板的方式。从Windows发送的字节是否可以由终端而不是我的程序捕获?
dcbSerialParams.fNull = 0;
dcbSerialParams.fDtrControl = DTR_CONTROL_DISABLE;
dcbSerialParams.fRtsControl = RTS_CONTROL_DISABLE;
T0:23:respawn:/sbin/getty -L ttymxc0 115200 vt100