我正在尝试使用c ++与某些设备通信:
出于安全原因,我们不允许使用WinXP,所以我们使用的是Win7。
如果我按原样运行该应用程序,则带有“ Y”的串行通信可以正常工作。如果我以“ Windows XP兼容模式”(特别是“ AdditiveRunAsHighest”标志)运行应用程序,则也可以连接到“ X”。
问题在于兼容性模式似乎中断了串行通信。我仍然可以打开端口并发送命令,但是该消息只是反弹回来。我试过同时使用CreateFileA()和CreateFileW()函数,但结果是相同的。
您是否有办法解决此问题?
任何反馈都值得赞赏。谢谢!
编辑:添加了用于串行通信的代码。我省略了错误处理以提高可读性
#include <Windows.h>
#include <stdio.h>
HANDLE hComm = CreateFileW(L"COM5", // or CreateFileA("COM5",
GENERIC_READ | GENERIC_WRITE, //Read/Write
0, // No Sharing
NULL, // No Security
OPEN_EXISTING, // Open existing port only
0, // Non Overlapped I/O
NULL);
// Get current state
DCB dcbSerialParams = { 0 }; // Initialize DCB structure
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
bool isReadCurrentCommState = GetCommState(hComm, &dcbSerialParams);
// New settings
dcbSerialParams.BaudRate = CBR_57600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
dcbSerialParams.fOutxCtsFlow = false; // software flow control
dcbSerialParams.fRtsControl = RTS_CONTROL_DISABLE; // software flow control
dcbSerialParams.fOutX = true; // software flow control
dcbSerialParams.fInX = true; // software flow control
bool isSetCommState = SetCommState(hComm, &dcbSerialParams);
// Timeouts
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 300;
timeouts.ReadTotalTimeoutConstant = 300;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 300;
timeouts.WriteTotalTimeoutMultiplier = 10;
bool isSetCommTimeouts = SetCommTimeouts(hComm, &timeouts);
// Write something to serial port
char lpBuffer[] = "command\r\n";
DWORD dNoOFBytestoWrite; // No of bytes to write into the port
DWORD dNoOfBytesWritten = 0; // No of bytes written to the port
dNoOFBytestoWrite = sizeof(lpBuffer);
bool writeStatus = WriteFile(hComm, // Handle to the Serial port
lpBuffer, // Data to be written to the port
dNoOFBytestoWrite, //No of bytes to write
&dNoOfBytesWritten, //Bytes written
NULL);
无论是否启用兼容模式,一切都返回true,但是设备仅在我不使用兼容模式时才接收命令。
编辑2:解决! 我再次重新启动了一切,现在可以正常工作了。我确实尝试过重新启动,所以不确定为什么这次可以正常工作,但是谢谢大家的评论。