RTS_CONTROL_TOGGLE не работает (имеет переменную задержку в 1-15 миллисекунд перед выключением после передачи) на нашей встроенной платформе XP. Возможно, я мог бы уменьшить это, если бы я изменил квант времени до 1 мс, используя timeBeginPeriod (1) и т. Д., Но я сомневаюсь, что это будет надежно или достаточно важно. (Иногда устройство реагирует на 1 миллисекунду)
Окончательное решение действительно ужасно, но оно работает на этом оборудовании. Я бы не использовал его ни на чем, где железо не зафиксировано в камне.
В основном:
1) установите для FIFO на странице диспетчера устройств последовательного порта значение off или 1 символ глубиной
2) отправьте ваше сообщение + 2 дополнительных байта , используя этот код:
int WriteFile485(HANDLE hPort, void* pvBuffer, DWORD iLength, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped)
{
int iOldClass = GetPriorityClass(GetCurrentProcess());
int iOldPriority = GetThreadPriority(GetCurrentThread());
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
EscapeCommFunction(hPort, SETRTS);
BOOL bRet = WriteFile(hPort, pvBuffer, iLength, pdwWritten, lpOverlapped);
EscapeCommFunction(hPort, CLRRTS);
SetPriorityClass(GetCurrentProcess(), iOldClass);
SetThreadPriority(GetCurrentThread(), iOldPriority);
return bRet;
}
WriteFile () возвращается, когда последний или два байта были записаны в последовательный порт. Они еще не вышли из порта, поэтому необходимо отправить 2 дополнительных байта. Один или оба из них будут разбиты, когда вы делаете CLRRTS.
Как я уже сказал ... это ужасно.