Forum

Einloggen | Registrieren | RSS  

sponsorpi(R)

13.07.2017,
20:18
(editiert von sponsorpi
am 13.07.2017 um 20:18)
 

Serielle Schnittstelle in Datei Umleiten [Windows, cmd] (Computertechnik)

Hallo liebe Leute,

folgendes ist mein Anliegen: Ich habe eine UART-Übertragung vom Mega8 an meinen PC realisiert (USB-Seriell-Adapter). Dies Funktioniert soweit recht ordentlich. Nun habe ich mir ein kleines Script geschrieben, welches die empfangenen Daten in eine Datei umleitet.

:loop
echo > com.txt
type COM1 > com.txt
timeout 1
goto loop

Das funktioniert nur teilweise. Logischer Weise bleibt es beim Auslesen und Umschreiben hängen, da dort kein Ende definiert ist. Folglich werden die Werte nacheinander in eine Datei gehämmert. Ich hätte allerdings gern, dass ich einen Wert an den Anfang der Datei schreibe, dieser dort ca. 1s steht und anschließend an selber Stelle überschrieben wird. Ist es möglich z.B. nach jedem Stoppbit der Übertragung das Auslesen zu beenden? Oder habt ihr einen anderen Lösungsansatz?

Würde mich freuen, ich danke euch.

Bin erst seit heute im Batch-Bussines :D

finni(R)

13.07.2017,
20:30

@ sponsorpi

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» :loop
» echo > com.txt
» type COM1 > com.txt
» timeout 1
» goto loop
»
» Das funktioniert nur teilweise.

Nach dem, was ich gelernt habe ist deine Schleife schon richtig, nur die Befehle darin nicht.

"echo > com.txt" leitet die Ausgabe in die "com.txt" um. Durch erneutes "echo > com.txt" wird die bisherige Datei "com.txt" überschrieben, der alte Wert ist weg.
"timeout 1" ist, soweit mir bekannt falsch. Es muss "timeout /t 1" lauten.

bastelix(R)

13.07.2017,
20:55

@ finni

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» » :loop
» » echo > com.txt
» » type COM1 > com.txt
» » timeout 1
» » goto loop
» »
» » Das funktioniert nur teilweise.
»
» Nach dem, was ich gelernt habe ist deine Schleife schon richtig, nur die
» Befehle darin nicht.
»
» "echo > com.txt" leitet die Ausgabe in die "com.txt" um. Durch erneutes
» "echo > com.txt" wird die bisherige Datei "com.txt" überschrieben, der alte
» Wert ist weg.
» "timeout 1" ist, soweit mir bekannt falsch. Es muss "timeout /t 1" lauten.

"echo >> com.txt" müsste auch unter Windows funktionieren, mit den zwei > wird der Text an die Datei angehängt, nur ein > überschreibt die Datei.

Unter aktuelleren Windows-Versionen gibt es auch die Power-Shell, hässliche Syntax aber wesentlich mächtiger als cmd. Nur für den Fall, dass es mit cmd weiterhin nicht klappt.

sponsorpi(R)

14.07.2017,
19:32
(editiert von sponsorpi
am 14.07.2017 um 19:33)


@ bastelix

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

Das Problem ist, dass er beim Einlesen des COM1 in einer Endlosschleife bleibt, ich also keine Veränderungen in der Datei vornehmen kann.

Ist mein Vorhaben, sprich das Schreiben eines Eingelesenen Wertes in eine Datei und dessen ständige Aktualisierung mit der cmd überhaupt machbar? Oder sollte ich lieber auf c++ umschwenken?

finni(R)

14.07.2017,
20:55

@ sponsorpi

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» Das Problem ist, dass er beim Einlesen des COM1 in einer Endlosschleife
» bleibt, ich also keine Veränderungen in der Datei vornehmen kann.

Ist normal, so ist dein Code in der Batch ja auch geschrieben, Endlosschleife. Wenn du das nicht möchtest, solltest du eine Programmiersprache nutzen. Einen Vorschlag hast du ja selber gepostet.

bigdie(R)

14.07.2017,
22:20

@ sponsorpi

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» Das Problem ist, dass er beim Einlesen des COM1 in einer Endlosschleife
» bleibt, ich also keine Veränderungen in der Datei vornehmen kann.
»
» Ist mein Vorhaben, sprich das Schreiben eines Eingelesenen Wertes in eine
» Datei und dessen ständige Aktualisierung mit der cmd überhaupt machbar?
» Oder sollte ich lieber auf c++ umschwenken?
Geht vieleicht auch ohne große Programmiererei, kostet aber 99€
Das programm heißt Profilab Expert von Abacom. Damit kann man sich dann eigene selbst laufende Programme erstellen und z.B. auch Signale der Com Schnittstelle als String verarbeiten. Gibt auch eine Demo auf der Abacom Seite.

bastelix(R)

15.07.2017,
01:53

@ sponsorpi

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» Das Problem ist, dass er beim Einlesen des COM1 in einer Endlosschleife
» bleibt, ich also keine Veränderungen in der Datei vornehmen kann.
Wie finni schon geschrieben hat ist :loop -> goto loop eine Endlosschleife. Ich kommentiere mal kurz deinen Code so wie ich den interpretiere (mit cmd hab ich nicht viel zu tun, und ich vermeide es mich mehr als absolut nötig damit zu befassen - wenn es schon Windows sein muss, dann doch lieber PowerShell, auch wenn die Syntax hässlich ist ;-) )

:: sprungmarke
:loop
:: überschreibe com.txt mit leerem Inhalt
echo > com.txt
:: überschreibe com.txt mit dem was type COM1 auf stdout ausgibt
type COM1 > com.txt
:: warte ne zeit lang - finni hat bzgl. der Argumente was geschrieben, lies besser nochmal nach ob du das richtig aufrufst
timeout 1
:: springe zur sprungmarke :loop (=Endlosschleife) und beginne erneut mit dem Überschreiben von com.txt
goto loop

» Ist mein Vorhaben, sprich das Schreiben eines Eingelesenen Wertes in eine
» Datei und dessen ständige Aktualisierung mit der cmd überhaupt machbar?
Kann ich dir leider nicht sagen, aber ich hab mal kurz google gefragt. Hier https://stackoverflow.com/a/1052766 wird https://www.eltima.com/products/rs232-data-logger/ empfohlen. Wobei sich das Abacom-Tool, welches bigdie vorschlägt, auch nicht schlecht liest.

» Oder sollte ich lieber auf c++ umschwenken?
Wenn du C++ kannst, und die Win-API-Calls für das Vorhaben auf dich nicht wie der Weg nach Mordor wirken: Ja! Auf jeden Fall!
Wenn du dazu erstmal C++ lernen müsstest wäre ein fertiges Tool oder eine Programmiersprache die du schon halbwegs beherrschst vermutlich die bessere Wahl.

sponsorpi(R)

15.07.2017,
16:08
(editiert von sponsorpi
am 15.07.2017 um 16:21)


@ bastelix

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» » Das Problem ist, dass er beim Einlesen des COM1 in einer Endlosschleife
» » bleibt, ich also keine Veränderungen in der Datei vornehmen kann.
» Wie finni schon geschrieben hat ist :loop -> goto loop eine Endlosschleife.
» Ich kommentiere mal kurz deinen Code so wie ich den interpretiere (mit cmd
» hab ich nicht viel zu tun, und ich vermeide es mich mehr als absolut nötig
» damit zu befassen - wenn es schon Windows sein muss, dann doch lieber
» PowerShell, auch wenn die Syntax hässlich ist ;-) )
»
» :: sprungmarke
» :loop
» :: überschreibe com.txt mit leerem Inhalt
» echo > com.txt
» :: überschreibe com.txt mit dem was type COM1 auf stdout ausgibt
» type COM1 > com.txt
» :: warte ne zeit lang - finni hat bzgl. der Argumente was geschrieben, lies
» besser nochmal nach ob du das richtig aufrufst
» timeout 1
» :: springe zur sprungmarke :loop (=Endlosschleife) und beginne erneut mit
» dem Überschreiben von com.txt
» goto loop

Genau so sollte es grundsätztlich auch laufen. Aber wie gesagt hängt es bei dem
type COM1 > com.txt
Die Schleife wird also nie wiederholt. Die cmd macht dasselbe wenn ich nur
type COM1 > com.txt
schreiben würde.

Ich vermute, dass das Auslesen des COM nicht beendet wird. Mir würde es ja reichen, wenn dieser nur für ca. 1s ausgelesen wird.

So sieht das aus, die von mir gewollte Schleife kommt nie zur Ausführung. Also wird auch die Datei nie zurückgesetzt.

» » Ist mein Vorhaben, sprich das Schreiben eines Eingelesenen Wertes in
» eine
» » Datei und dessen ständige Aktualisierung mit der cmd überhaupt machbar?
» Kann ich dir leider nicht sagen, aber ich hab mal kurz google gefragt. Hier
» https://stackoverflow.com/a/1052766 wird
» https://www.eltima.com/products/rs232-data-logger/ empfohlen. Wobei sich
» das Abacom-Tool, welches bigdie vorschlägt, auch nicht schlecht liest.

Habe ich probiert, an sich eine nette Sache. Aber auch hier lässt sich das nicht in dem gewünschten Format realisieren.

» » Oder sollte ich lieber auf c++ umschwenken?
» Wenn du C++ kannst, und die Win-API-Calls für das Vorhaben auf dich nicht
» wie der Weg nach Mordor wirken: Ja! Auf jeden Fall!

Naja können ist so eine Sache... habe es zwei Semester gehabt und nehme es hin und wieder am Raspi.

» Wenn du dazu erstmal C++ lernen müsstest wäre ein fertiges Tool oder eine
» Programmiersprache die du schon halbwegs beherrschst vermutlich die bessere
» Wahl.

Wäre gern den einfachen Weg über die cmd gegangen... :-|

finni(R)

15.07.2017,
17:02

@ sponsorpi

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» Ich vermute, dass das Auslesen des COM nicht beendet wird.

Das passiert bei mir auch. Es kommen wohl keine Daten von COM1. Ist auch normal, ich habe da nichts dran.
Er hängt dann aber nicht in einer Schleife, wie du eingangs geschrieben hast, sondern er wartet auf Daten.
Ich frage mich ob der Befehl funktionieren würde, wenn etwas an COM1 angeschlossen wäre und Daten liefert. Batch ist wohl hier fehl am Platze. Eine Programmiersprache, die fehlende Daten entsprechend auswerten kann, wäre wohl besser geeignet.

bastelix(R)

15.07.2017,
22:43

@ sponsorpi

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

Hab eben mal type nachgelesen. Sicher, dass es das richtige tool für die Aufgabe ist?

"TYPE CON > Newfile.txt
This will require typing a CTRL-Z to indicate the end of file."
Quelle: https://ss64.com/nt/type.html

Wenn von COM1 kein EOL kommt, und das macht bei einer seriellen Übertragung die permanent laufen soll wenig Sinn, wird type nie terminieren und deine Schleife hängt.

» » » Oder sollte ich lieber auf c++ umschwenken?
» » Wenn du C++ kannst, und die Win-API-Calls für das Vorhaben auf dich
» nicht
» » wie der Weg nach Mordor wirken: Ja! Auf jeden Fall!
»
» Naja können ist so eine Sache... habe es zwei Semester gehabt und nehme es
» hin und wieder am Raspi.

Einfacher wäre es, wenn du den Mega8 an den PI hängst (oder auf dem PC ein Betriebssystem hättest) aber wenn du C++ eh schon gelegentlich einsetzt kannst dich auch mal an nem Windows-Programm versuchen ;-)

» Wäre gern den einfachen Weg über die cmd gegangen... :-|
cmd hat sich seit DOS-Zeiten kaum weiterentwickelt, Dateiumleitungen (via < >;) und Pipes ( | ) sind mit W2K bzw. XP dazugekommen und mehr hat sich da nicht getan. Irgendwann wurde dann PowerShell veröffentlicht und da hat man halt das komplette .NET-Framework unterm Bürzel. Die ist schon wesentlich mächtiger als cmd, nur wie man ein anständiges Terminal-Fenster baut hat MS immer noch nicht gelernt ;-)

sponsorpi(R)

17.07.2017,
11:14

@ bastelix

Serielle Schnittstelle in Datei Umleiten [Windows, cmd]

» Hab eben mal type nachgelesen. Sicher, dass es das richtige tool für die
» Aufgabe ist?

Nein, sicher bin ich mir da nicht ^^

» "TYPE CON > Newfile.txt
» This will require typing a CTRL-Z to indicate the end of file."
» Quelle: https://ss64.com/nt/type.html
»
» Wenn von COM1 kein EOL kommt, und das macht bei einer seriellen Übertragung
» die permanent laufen soll wenig Sinn, wird type nie terminieren und deine
» Schleife hängt.

Genau, sowas in der Art dachte ich mir...

» » » » Oder sollte ich lieber auf c++ umschwenken?
» » » Wenn du C++ kannst, und die Win-API-Calls für das Vorhaben auf dich
» » nicht
» » » wie der Weg nach Mordor wirken: Ja! Auf jeden Fall!
» »
» » Naja können ist so eine Sache... habe es zwei Semester gehabt und nehme
» es
» » hin und wieder am Raspi.
»
» Einfacher wäre es, wenn du den Mega8 an den PI hängst (oder auf dem PC ein
» Betriebssystem hättest) aber wenn du C++ eh schon gelegentlich einsetzt
» kannst dich auch mal an nem Windows-Programm versuchen ;-)
» » Wäre gern den einfachen Weg über die cmd gegangen... :-|
» cmd hat sich seit DOS-Zeiten kaum weiterentwickelt, Dateiumleitungen (via <
» >;) und Pipes ( | ) sind mit W2K bzw. XP dazugekommen und mehr hat sich da
» nicht getan. Irgendwann wurde dann PowerShell veröffentlicht und da hat man
» halt das komplette .NET-Framework unterm Bürzel. Die ist schon wesentlich
» mächtiger als cmd, nur wie man ein anständiges Terminal-Fenster baut hat MS
» immer noch nicht gelernt ;-)

Habe mir jetzt erstmal mit c++ beholfen. Das Programm liest immer den letzten Wert der Datei aus und schreibt diesen in eine andere. Dort wird er anschließend immer wieder aktualisiert... die Lösung ist zwar nicht wirklich schön, geht aber erstmal. Ich werde mich wohl mal wieder intensiver damit auseinandersetzen. Ich danke euch für eure Hilfe :)