Обрывы последовательной связи в режиме совместимости WinXP - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь установить связь с некоторым оборудованием, используя c ++:

  • Оборудование 'X': используется API, для которого требуется WinXP
  • Оборудование 'Y': связь через последовательную связь

В целях безопасности нам не разрешено использовать WinXP, поэтому мы используем Win7.

Последовательная связь с «Y» работает нормально, если я запускаю приложение как есть.Я также могу подключиться к «X», если я запускаю приложение в «режиме совместимости с Windows XP» (в частности, с флагом «AdditiveRunAsHighest»).

Проблема заключается в том, что режим совместимости нарушает последовательную связь,Я все еще могу открыть порт и отправить команды, но сообщение просто возвращается.Я пытался использовать функции 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);

Все возвращается как с режимом совместимости, так и без него, но оборудование получает команду только тогда, когда я не использую режим совместимости.

Редактировать 2: Решено!Я перезапустил все снова и теперь это работает.Я пытался перезагрузиться раньше, поэтому не уверен, почему это сработало на этот раз, но спасибо всем за ваши комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...