RTS_CONTROL_TOGGLE在我们的嵌入式 XP 平台上不起作用(在传输后关闭它之前有 1-15 毫秒的可变延迟)。如果我使用 timeBeginPeriod(1) 等将时间量更改为 1 毫秒,我可能会降低它,但我怀疑它是否可靠或足够重要。(设备有时会在 1 毫秒内响应)
最终的解决方案真的很难看,但它适用于这个硬件。我不会在硬件没有固定在石头上的任何东西上使用它。
基本上:
1) 将串口设备管理器页面上的 FIFO 设置为关闭或 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 时,它们中的一个或两个都会被丢弃。
就像我说的......它很丑。