首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows嵌入式- RS485问题

Windows嵌入式- RS485问题
EN

Stack Overflow用户
提问于 2009-06-19 15:21:13
回答 2查看 3.3K关注 0票数 1

我们有一个运行的系统,COM2是一个硬件RS485端口。

在我的代码中,我使用RTS_CONTROL_TOGGLE设置DCB。我想那会照它说的做..。当出现写空中断时,在内核模式下关闭RTS。这应该是即时的。

相反,我们可以在一个范围内看到PC驱动总线的时间比消息结束时间长1-8毫秒。我们正在交谈的设备在大约1到5毫秒内做出了响应。所以..。通讯腐败泛滥。不,没有办法改变目标的响应时间。

我们现在已经连接到RS232端口,并将范围连接到TX和RTS行,我们也看到了同样的情况。RTS行在发送消息后保持高1-8毫秒。

我们也尝试关闭FIFO,或设置FIFO深度为1,没有任何效果。

有什么想法吗?在"SendFile,清除RTS“周期中,我将尝试从用户模式手动控制RTS行,并具有实时优先级。我也不太希望这件事能成功。这不应在用户模式下进行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-19 17:58:28

在我们的嵌入式XP平台上,RTS_CONTROL_TOGGLE不能工作(在传输后关闭它之前有一个变量1-15毫秒的延迟)。如果我用timeBeginPeriod(1)等方法将时间量子数改变为1ms,我就有可能把它弄下来,但我怀疑它是否可靠或是否足够重要。(设备有时响应@1毫秒)

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

基本上:

1)将串口设备管理器页面上的FIFO设置为off或1字符深度

2)使用以下代码发送消息+ 2额外字节

代码语言:javascript
复制
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时,其中一个或两个都会被销毁。

就像我说的。太丑了。

票数 4
EN

Stack Overflow用户

发布于 2009-06-19 15:45:54

有什么想法吗?

您可能会发现DDK中有串口驱动程序的源代码,这将让您看到应该如何实现该选项:即,它是处于中断级、DPC级,还是更糟。

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

8毫秒似乎是一个令人失望的长时间;我知道XP不是一个RTOS,但我希望它(通常)做得更好。另一件要考虑的事情是,是否还有其他高优先级线程正在运行,而这些线程可能会产生干扰。如果您在自己的应用程序中增加了一些线程的优先级,那么也许您应该减少其他线程的优先级。

--我打算在"SendFile,清除RTS“循环中,用实时优先级从用户模式手动控制RTS线路。

不要让这个线程失控: IME这样的线程,如果它是错误的,就可以永远抢占所有其他用户模式的线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1018556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档