代码之家  ›  专栏  ›  技术社区  ›  darron

Windows XP嵌入式-RS485问题

  •  1
  • darron  · 技术社区  · 15 年前

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

    在我的代码中,我用 RTS U控制开关 . 我想会照上面说的做…一旦写空中断发生,关闭内核模式下的RTS。那应该是即时的。

    相反,我们看到在一个范围内,PC驱动总线的时间比消息结束时间长1-8毫秒。我们正在通话的设备大约在1-5毫秒内响应。所以…通讯系统严重腐败。不,无法更改目标的响应时间。

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

    我们还尝试关闭FIFO,或者将FIFO深度设置为1,但没有效果。

    有什么想法吗?在“sendfile,clear rts”循环中,我将尝试以实时优先级从用户模式手动控制RTS行。我也没有太多希望这能奏效。这不应该在用户模式下完成。

    2 回复  |  直到 15 年前
        1
  •  4
  •   darron    15 年前

    RTS U控制开关 在我们的嵌入式XP平台上不工作(在传输后关闭它之前有一个可变的1-15毫秒延迟)。如果我使用TimeBeginPeriod(1)等将时间量更改为1毫秒,我可能会降低这个值,但我怀疑它是否可靠或足够重要。(设备有时响应1毫秒)

    最后的解决方案确实很难看,但它在这个硬件上工作。我不会把它用在任何没有用石头固定硬件的地方。

    基本上:

    1)将串行端口设备管理器页面上的FIFOS设置为关闭或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的时候,它们中的一个或两个会被丢弃。

    就像我说的…太难看了。

        2
  •  1
  •   ChrisW    15 年前

    有什么想法吗?

    您可能会发现DDK中有串行端口驱动程序的源代码,这可以让您了解如何实现该选项:即,它是否处于中断级别、DPC级别或更糟的级别。

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

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

    在“sendfile,clear rts”循环中,我将尝试以实时优先级从用户模式手动控制RTS行。

    不要让那个线程失控:如果一个这样的线程的bugy永远抢占其他所有用户模式的线程,那么IME也可以。

    推荐文章