Serielle Kommunikation (RTS) und Windows 7
Ich bin der Entwicklung Delphi-Anwendung auf Delphi 2010, XE und RAD Studio unter Windows 7. Mein Antrag spricht über den seriellen port non-stop. Ich bin mit AsyncPro für Delphi 2010. Serielle Kommunikation und alles andere auf dem computer entwickle ich mit funktioniert Super ohne jedes problem. Aber wenn meine release-version meiner Applikation läuft auf einem anderen Windows 7 system, serielle Kommunikation komplett fehlschlägt. Wir sondierten die serielle Kommunikation selbst, nach einer Antwort und fand heraus, dass die Anforderung zum Senden (RTS) - Zeile nicht gelöscht wird, direkt nach dem Absenden der bytes, in der Erwägung, dass auf meinem computer Entwicklung RTS-Linie gefallen ist korrekt.
Selbst wenn ich explizit fallen die RTS-Leitung auf low oder false, Zustand, RTS-line nicht drop sofort, aber nach gut 15 Millisekunden. So, serielle Kommunikation, der auf meine version ist zu Versagen.
Fehlen mir wichtige Informationen über Windows 7 und serielle Kommunikation Fragen?
UPDATE: ich habe gerade den Fehler gefunden, mit meinem Aysncpro 5.0 für Delphi XE. Es ist merkwürdig. Wenn mein Delphi XE-IDE geöffnet ist oder läuft, mein Programm ist die Kommunikation einwandfrei. Wenn ich auf Herunterfahren oder schließen, mein Delphi XE IDE, während mein Programm läuft, das gleiche Programm, nicht sehr gut kommunizieren, oder es mal aus.
Glockenspiel in, wenn Sie eine Idee haben, warum es geschieht.
Jede Hilfe wird geschätzt.
Danke,
- Wie gesagt, AsyncPro, ist das, was passiert ist. 🙂 Jetzt weißt du es ist ein bug in der async pro. Ihre Unfähigkeit zu bekommen, die TComPort-demo arbeiten, ist wahrscheinlich einfach und trivial zu überwinden. Eine Frage stellen über das, und ich werde eine funktionsfähige demo für Sie.
- Ist Ihre Anwendung unter Einsatz von BPLs (Laufzeit-packages)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Klingt wie eine timer-Auflösung problem für mich. Ich hatte das gleiche problem beim schreiben auf ein USB-FTDI-Treiber mit einem Ereignis-basierten timer mit
timeSetEvent()
... Wenn Delphi geladen, es ändert sich die timer-Auflösung kleiner als 20ms, was meine app funktionieren. Wenn die IDE nicht ausgeführt ich konnte nicht Dinge arbeiten unter 20ms +/- 5ms (der Standard-Windows-Auflösung glaube ich).Um das problem zu beheben, ich nenne
timeBeginPeriod(1)
im thread um die minimale systemweite timer-Auflösung.Ich glaube, das wirkt sich auf die Auflösung des anderen zeitbasierte Ereignisse, weil ich besser als +/-5ms Genauigkeit auf andere (nicht-multimedia-timer) warten Ereignisse in meiner app verwenden, wenn ich
timeBeginPeriod()
.Also, was ich Vorschlage, ist, dass irgendwo in den AsyncPro code es einige Zeit, Ereignis oder rufen Sie zurück... Das wäre betroffen von Delphi ändern der timer-Auflösung, wenn es geladen wird. Versuchen Sie anrufen
timeBeginPeriod(1)
irgendwo in deiner app, wenn es startet und sehen, ob gab es eine Veränderung.Oh, und vergessen Sie nicht, rufen
timeEndPeriod(1)
wenn Ihre app beendet wird.N@
Letzten paar Male, die ich sah zufällig unerklärlichen Mist wie ich, alles versucht, und war nicht in der Lage, es zu lösen, für Monate.
Fand ich zwei verschiedene Ursachen:
ASYNC Professional hat einige seltsame Störungen, dass ich nicht in der Lage war zu lösen, also ließ ich es und zog in TComPort.
Fand ich alle Arten von seltsamen flow-control-Fehler im USB-Treiber. Ich fand FTDI Chipsatz-USB-zu-Seriell-zuverlässiger als andere.
Den Debug-build nicht habe das problem könnte sein, zwei Dinge:
Gewissen zeitlichen Veränderungen Ursache das USB-Gerät, Treiber wurde nicht, nicht zu scheitern.
Du eigentlich irgendeine Art von thread-problem, wie eine race condition, die zu Ihrem ASync Pro-Komponenten Durcheinander in einer Weise, dass sieht aus wie etwas passiert, um Ihre port -, aber eigentlich ist es ASYNC pro.
Die einfachste Sache zu tun ist, um zu versuchen, es mit einem anderen USB-zu-Seriell-adapter, und wenn das nicht Ihr problem lösen, ich wäre versucht zu ziehen AsyncPro, die ich auch schon viele verschiedene Probleme mit, und entweder schreiben Sie Ihre eigenen seriellen port class, oder verwenden Sie TComPort. Ich habe auch einige Zeit lang Erfahrung mit der Verwendung von TThread, die einen com-Anschluss verwendet "reader/writer" - Klasse und habe festgestellt, dass dies der zuverlässigste Weg zu gehen, denn Sie können zwicken low-level-Elemente, die von der Win32-overlapped-IO-Aufrufe, die direkt auf Ihre Bedürfnisse, und auch sicher sein, dass Sie nicht über einige zusätzliche Komplexität/overhead-immer im Weg. (AsyncPro die Komplexität und den Aufwand, eine bedeutende potentielle Quelle für Fehler.)
Dies ist ein Treiber-problem auf dem anderen Rechner, oder? Hardware-flow-control funktioniert gut auf meinem W7-test box als gut, (und Vista-Entwicklung-Maschine). Wenn Ihr Apro hat die DCB richtig, und es klingt, wie es tut, weil der Ihre "manuelle" tests, die Treiber sollte Arbeit...
15ms für eine 'manuelle' RTS ändern von Benutzer-Modus ist traurig, aber überhaupt nicht ungewöhnlich auf Windows - das ist, warum die Treiber sollte es tun.
Rgds,
Martin