2009-06-19 74 views
1

我们有一个运行XP嵌入式系统,COM2是一个硬件RS485端口。嵌入式Windows XP - RS485问题

在我的代码中,我使用RTS_CONTROL_TOGGLE设置了DCB。我会假设它会做它所说的......一旦发生空写中断,关闭内核模式下的RTS。这应该几乎是瞬间的。我们在一个范围内看到,PC正在驱动总线,比信息的末尾长1-8毫秒。我们正在与之通话的设备的响应时间约为1至5毫秒。所以......传播腐败盛行。不,没有办法改变目标的响应时间。

我们现在已经连接到RS232端口,并将示波器连接到TX和RTS线路,我们看到了同样的事情。消息发送后,RTS线保持高1-8毫秒。

我们也尝试关闭FIFO,或将FIFO深度设置为1,但不起作用。

任何想法?我将在“SendFile,clear RTS”周期期间尝试使用REALTIME优先级从用户模式手动控制RTS线路。我没有太多的希望,这也可以工作。这不应该在用户模式下完成。

+1

我讨厌在嵌入式开发问题时可以在任何地方找到有限的支持。理学士在计算机工程,EIT和我正在做的.Net开发全职,而我渴望与我的开发板和fpgas修补,希望工具和支持嵌入式开发不久的将来会好起来。 但我希望你在这个问题上运气。 – marr75 2009-06-19 15:28:22

回答

4

RTS_CONTROL_TOGGLE不工作(具有发射后,将其关闭之前,变量1-15毫秒的延迟)对我们的嵌入式XP平台。如果我使用timeBeginPeriod(1)等将时间量程改为1 ms,那么我可能会弄错它,但是我怀疑它是否可靠或足够重要。 (设备有时会响应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时,其中一个或两个人都会被破坏。

就像我说的...这很丑。

1

任何想法?

您可能会发现有一个为在DDK中的串口驱动程序,这将让你看到这个选项应该如何实现源代码:即无论是在中断级别,在DPC级,或更差。

其他可能性包括重写驱动程序;使用第三方RS485驱动程序,如果你能找到一个;或者使用第三方RS485硬件和其自己的驱动程序(例如,至少在过去用于制作具有32个端口,深度缓冲区和自己的微处理器的“智能串行端口板”的第三方;我期望RS485是一个问题由某人解决)。

8毫秒似乎确实是一个令人失望的长时间;我知道XP不是RTOS,但我希望它(通常)比这更好。另一个要看的是是否有其他高优先级的线程正在运行,这可能会造成干扰。如果您在自己的应用程序中提高了某些线程的优先级,或许应该降低其他线程的优先级。

即将尝试在“SendFile,清除RTS”周期期间尝试使用REALTIME优先级从用户模式手动控制RTS线路。

不要让那个线程失去控制:IME是一个像这样的线程,如果它有错误,它会永远抢占所有其他用户模式线程。

+0

是的,但是如果你在那一节所做的是“SendFile,EscapeCommFunction(CLRRTS)”,那么它不应该是越野车,不是?只要你发送的缓冲区有时不是NULL或任何东西。这应该是安全的。我会明白的。 :) – darron 2009-06-19 15:51:59

+0

这是一个同步的SendFile,我接受它。如果该线程在从EscapeCommFunction返回时不阻塞甚至不睡觉任何东西(如果相反,它只是循环),那么将出现“Buggy”。 – ChrisW 2009-06-19 16:16:54