我们有一个运行的系统,COM2是一个硬件RS485端口。
在我的代码中,我使用RTS_CONTROL_TOGGLE设置DCB。我想那会照它说的做..。当出现写空中断时,在内核模式下关闭RTS。这应该是即时的。
相反,我们可以在一个范围内看到PC驱动总线的时间比消息结束时间长1-8毫秒。我们正在交谈的设备在大约1到5毫秒内做出了响应。所以..。通讯腐败泛滥。不,没有办法改变目标的响应时间。
我们现在已经连接到RS232端口,并将范围连接到TX和RTS行,我们也看到了同样的情况。RTS行在发送消息后保持高1-8毫秒。
我们也尝试关闭FIFO,或设置FIFO深度为1,没有任何效果。
有什么想法吗?在"SendFile,清除RTS“周期中,我将尝试从用户模式手动控制RTS行,并具有实时优先级。我也不太希望这件事能成功。这不应在用户模式下进行。
发布于 2009-06-19 17:58:28
在我们的嵌入式XP平台上,RTS_CONTROL_TOGGLE不能工作(在传输后关闭它之前有一个变量1-15毫秒的延迟)。如果我用timeBeginPeriod(1)等方法将时间量子数改变为1ms,我就有可能把它弄下来,但我怀疑它是否可靠或是否足够重要。(设备有时响应@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()返回。他们还没有离开端口,因此需要发送两个额外的字节。当您执行CLRRTS时,其中一个或两个都会被销毁。
就像我说的。太丑了。
发布于 2009-06-19 15:45:54
有什么想法吗?
您可能会发现DDK中有串口驱动程序的源代码,这将让您看到应该如何实现该选项:即,它是处于中断级、DPC级,还是更糟。
其他可能性包括重写驱动程序;如果可以找到第三方RS485驱动程序;或者使用第三方RS485硬件和自己的驱动程序(例如,至少在过去,第三方用于制造带有32个端口、深度缓冲区和自己的微处理器的“智能串行端口板”;我希望有人已经解决了RS485的问题)。
8毫秒似乎是一个令人失望的长时间;我知道XP不是一个RTOS,但我希望它(通常)做得更好。另一件要考虑的事情是,是否还有其他高优先级线程正在运行,而这些线程可能会产生干扰。如果您在自己的应用程序中增加了一些线程的优先级,那么也许您应该减少其他线程的优先级。
--我打算在"SendFile,清除RTS“循环中,用实时优先级从用户模式手动控制RTS线路。
不要让这个线程失控: IME这样的线程,如果它是错误的,就可以永远抢占所有其他用户模式的线程。
https://stackoverflow.com/questions/1018556
复制相似问题