WinXP兼容模式下的串行通讯中断

时间:2018-10-25 18:11:46

标签: c++ serial-port backwards-compatibility

我正在尝试使用c ++与某些设备通信:

  • 设备'X':使用需要WinXP的API
  • 设备“ Y”:通过串行通讯进行通讯

出于安全原因,我们不允许使用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:解决! 我再次重新启动了一切,现在可以正常工作了。我确实尝试过重新启动,所以不确定为什么这次可以正常工作,但是谢谢大家的评论。

0 个答案:

没有答案