Я пытаюсь установить связь с некоторым оборудованием, используя 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: Решено!Я перезапустил все снова и теперь это работает.Я пытался перезагрузиться раньше, поэтому не уверен, почему это сработало на этот раз, но спасибо всем за ваши комментарии.