Frage

Wir haben ein System mit XP embedded bekommen, mit COM2 einem Hardware-RS485-Port ist.

In meinem Code, ich bin Einstellung der DCB up mit RTS_CONTROL_TOGGLE . Ich würde davon ausgehen, dass tun würde, was er sagt ... drehen RTS im Kernel-Modus ausgeschaltet, sobald die Schreib leer Interrupt geschieht. Das sollte praktisch sofort sein.

Stattdessen sehen wir auf einem Umfang, dass der PC 1 bis 8 Millisekunden mit dem Bus überall fährt länger als das Ende der Nachricht. Das Gerät, das wir sprechen, ist in etwa 1-5 Millisekunden reagiert. So ... Kommunikation Verfälschungen in Hülle und Fülle. Nein, es gibt keine Möglichkeit, das Ziel der Reaktionszeit zu ändern.

Wir haben nun die RS232-Schnittstelle und verbunden, um den Umfang der TX und RTS Leitungen angeschlossen, und wir die gleiche Sache zu sehen. Die RTS-Leitung bleibt hoch 1-8 Millisekunden, nachdem die Nachricht gesendet wird.

Wir haben versucht, auch die FIFO ausgeschaltet oder das FIFO-Tiefen ohne Wirkung auf 1 zu setzen.

Irgendwelche Ideen? Ich bin über manuell versuchen, die RTS-Leitung vom Benutzermodus mit ECHTZEIT Priorität bei dem „Sendfile, klar RTS“ Zyklus zu steuern. Ich habe nicht viele Hoffnungen, dass diese entweder funktionieren. Dies sollte nicht im Benutzermodus erfolgen.

War es hilfreich?

Lösung

RTS_CONTROL_TOGGLE nicht funktioniert (hat eine variable 1-15 Millisekunden Verzögerung, bevor es ab, nachdem Sende Drehen) auf unserer embedded XP-Plattform. Es ist möglich, ich könnte das herunterkommen, wenn ich die Zeit Quanten bis 1 ms mit timebeginperiod (1) geändert, etc, aber ich bezweifle, wäre es zuverlässig oder genug sein, um Materie. (Das Gerät antwortet @ 1 Millisekunde manchmal)

Die endgültige Lösung ist wirklich hässlich, aber es funktioniert auf dieser Hardware. Ich würde es nicht auf etwas verwenden, wenn die Hardware nicht in Stein festgelegt ist.

Grundsätzlich gilt:

1) gesetzt, die FIFOs auf der Geräte-Manager Seite der seriellen Schnittstelle ausgeschaltet oder 1 Zeichen tief

2) senden Sie Ihre Nachricht + 2 zusätzliche Bytes mit diesem Code:

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;
}

Die Writefile () zurückgibt, wenn das letzte Byte oder zwei haben an die serielle Schnittstelle geschrieben. Sie haben nicht den Hafen noch hinausgegangen, wodurch die Notwendigkeit 2 zusätzliche Bytes zu senden. Eine oder beide trashed werden erhalten, wenn Sie CLRRTS tun.

Wie ich schon sagte ... es ist hässlich.

Andere Tipps

  

Irgendwelche Ideen?

Sie können feststellen, dass es Quellcode für den seriellen Port-Treiber in der DDK ist, die Sie lassen würden sehen, wie diese Option sollen umgesetzt werden. Dh, ob es bei Interrupt-Ebene ist, auf DPC-Ebene, oder noch schlimmer

Weitere Möglichkeiten sind Umschreiben des Fahrers; mit einer RS485-Treiber 3rd-Party, wenn Sie einen finden können; oder 3rd-Party-RS485-Hardware mit seinen eigenen Treiber (zB zumindest in den letzten dritten Parteien verwendet „intelligente serielle Schnittstelle Boards“ mit 32 Ports, tiefen Puffern und einen eigenen Mikroprozessor zu machen, erwarte ich, dass RS485 ein Problem, das gewesen ist gelöst, indem jemand).

8 Millisekunden scheint wie eine enttäuschende lange Zeit; Ich weiß, dass XP nicht ein RTOS ist, aber ich würde erwarten, dass es (in der Regel) nicht besser als die. Eine andere Sache zu betrachten ist, ob es andere mit hoher Priorität Threads ausgeführt wird, was zu stören werden. Wenn Sie die Prioritäten einige Threads in Ihrer eigenen Anwendung Steigerung habe, vielleicht stattdessen sollten Sie die Prioritäten der anderen Threads werden zu reduzieren.

  

Ich bin über manuell versuchen, die RTS-Leitung vom Benutzermodus mit ECHTZEIT Priorität Steuerung während der „Sendfile, klar RTS“ -Zyklus.

Lassen Sie sich nicht, dass die Gewinde außer Kontrolle geraten: so einen Thread IME kann, wenn es Buggy immer alle anderen User-Mode-Thread preempt ist

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top