Forum: Mikrocontroller und Digitale Elektronik HEX-Datei in Bitmap wandeln


von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine Hardcopy von meinem Grafikdisplay mit dem Prozessor 
generiert und sende diese über die RS232-Schnittstelle. Die Daten sind 
schon so aufbereitet, daß diese dem Bitmap-Format entsprechen. Ich 
benötige nun ein Programm, das die RS232-Daten empfängt und die Daten 
als BMP-Datei speichert.

Bisher habe ich zwar eine Lösung für dieses Problem, aber das Ganze ist 
recht umständlich:

Ich benutze das Programm Bintherm, um die Daten der RS232-Schnittstelle 
aufzuzeichnen. Die Zeichen stelle ich in HEX dar und kopiere diese dann 
in die Zwischenablage (siehe angehängte Datei).

Als zweiten Schritt nehme ich den HEX-Editor "Hex-Editor MX" und kopiere 
da den Inhalt der Zwischenablage rein. Danach wird die Datei 
gespeichert.

Kennt jemand ein entsprechendes Programm, wo das einfacher geht?

Gruß
Martin

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

und so sieht die Datei aus, wenn man sie über den beschriebenen Weg als 
BMP speichert... (siehe Anhang).

von Micha (Gast)


Lesenswert?

Wenn ich Dich recht verstehe, kommt über die Rs232 schon eine komplette 
Datei rein? Du must also "nur" die Daten in eine Datei schreiben? Geht 
das nicht mit so jedem Terminal-Program ("Datei empfangen"). Du könntest 
auch mal ein simples "copy com1 bitmap.bmp /B" vesuchen (wenn Dein 
letztes gesendetes Zeichen ein EOF  bzw. EOT (ASCII-Zeichen hab ich 
nicht im Kopf)

von Peter (Gast)


Lesenswert?

> Die Daten sind schon so aufbereitet, daß diese dem Bitmap-Format
> entsprechen.

dann schick doch einfach einen BMP header vorweg und dann hast du dein 
BMP.
;-)

von Martin M. (martin69)


Lesenswert?

@Micha:
Ja, die Daten müssen nur noch gespeichert werden. Die kommen schon so 
komplett vom Prozessor. Am PC ist keine Datenwandlung erforderlich.

Bei Windows XP gibt es zwar das Hyperterminal, aber damit bin ich nicht 
klar gekommen. Ich weiß nicht, ob das überhaupt mit diesem gehen könnte.

Wie soll das mit "copy com1 bitmap.bmp /B" gehen?

von Martin M. (martin69)


Lesenswert?

@Peter:
Der BMP-Header ist schon in den Daten vom Prozessor enthalten. Es gibt 
nur ein Problem, das ganze auf der PC-Seite zu empfangen und 1:1 zu 
speichern...

von Peter (Gast)


Lesenswert?

> Der BMP-Header ist schon in den Daten vom Prozessor enthalten. Es gibt
> nur ein Problem, das ganze auf der PC-Seite zu empfangen und 1:1 zu
> speichern...
ach so...
na, dann könntest du die daten byteweise einlesen, auf dem pc den header 
interpretieren und dann weisst du ja, wieviele bytes noch kommen. du 
müsstest allerdings ein kleines progrämmchen für den pc schreiben, das 
ist aber trivial.
...oder du packst um das ganze noch ein protokoll, ähnlich diesem hier: 
http://en.wikipedia.org/wiki/Type-length-value dann könntest du auch 
noch andere objekte, ausser BMP's senden.
:-)

von Martin M. (martin69)


Lesenswert?

Peter wrote:
> du
> müsstest allerdings ein kleines progrämmchen für den pc schreiben, das
> ist aber trivial.

... das möchte ich vermeiden, denn mit Dateihandling auf dem PC bin ich 
nicht so fit. Ich programmiere nicht so oft. Und wenn, dann nur 
Controller. Ich bin froh, daß das mit der Hardcopy-Funktion im ATMega128 
inkl. Einarbeitung in das Bitmap-Thema in einem Tag geklappt hat....

Gibt es denn nicht ein Terminalprogramm, das empfangene Daten 
"vernünftig" speichern kann?

von Kai F. (k-ozz)


Angehängte Dateien:

Lesenswert?

@Martin
Ich habe dir grad mal fix ein kleines Programm geschrieben, was den 
ankommenden Datenstrom in eine Datei schreibt. Ist zwar quick&dirty, 
aber ich hoffe, dass es trotzdem deinen Wünschen gerecht wird.
Gruß
Kai

von Micha (Gast)


Lesenswert?

> Wie soll das mit "copy com1 bitmap.bmp /B" gehen?

Falls Du Windows bzw. MS-Dois benutzt: Du machst ein Dos-Fenster auf 
(Start --> Ausführen --> "cmd" bzw. Windows-Taste & "R" --> "cmd"). Dann 
gibst Du die Befehlszeile ein und startest den Transfer vom µC. Unter 
den meisten Betriebssystemen kann man die Schnittstellen als Datei 
ansprechen. "com1" ist die erste serielle Schnittstelle, "com2" die 
zweite ("lpt1" entsprechned die parallele, "con" die Konsole also 
Tastatur). Die Befehlszeile kopiert also die Datei von der angegeben 
Stelle in die neue Datei. Der Schalter "/B" bedeutet, das binär-Dateien 
kopiert werden sollen.

von Martin M. (martin69)


Lesenswert?

@Kai F.
Vielen Dank für das Programm. Funktioniert super!

Ich habe bisher noch nie was für Windows programmiert. Habe nur vor ca. 
8 Jahren ein paar kleine DOS-Programme geschrieben (unter C, C verwende 
ich nun auch für den AVR). Mich würde mal interessieren, wie der 
Quellcode für das Programm aussieht. Was für eine Programmiersprache 
verwendest Du? Visual Basic? Ich bin am überlegen, ob ich auch mal ein 
paar kleine Programme selber schreiben soll.

Welche Programmiersprache zur Windows-Programmerstellung ist einfach zu 
erlernen? Und wieviel kostet ein Compiler hierfür?

Gruß
Martin

von Simon K. (simon) Benutzerseite


Lesenswert?

Martin Müller wrote:
> DOS-Programme geschrieben (unter C [...]

Du hast vermutlich keine DOS-Programme geschrieben, sondern 
Konsolenprogramme... Was hindert dich daran sowas nochmal zu tun? ;)

von Martin M. (martin69)


Lesenswert?

Simon Küppers wrote:
> Du hast vermutlich keine DOS-Programme geschrieben, sondern
> Konsolenprogramme... Was hindert dich daran sowas nochmal zu tun? ;)

EXE-Dateien waren das damals.....
Zum einen müßte ich den C-Compiler erst mal installieren (hab nur uralte 
Disketten und mein aktueller PC hat kein Diskettenlaufwerk mehr). Zum 
anderen sehen Windows-Programme schöner aus g. Das hat mich schon 
immer gereizt, so was mal selber zu machen.

von Peter (Gast)


Lesenswert?

> Welche Programmiersprache zur Windows-Programmerstellung ist einfach zu
> erlernen? Und wieviel kostet ein Compiler hierfür?

wenn du schon C kannst: es gibt viele freie C-compiler für windoofs, 
z.b. MSVC express edition, diverse borland compiler, den watcom, 
pelles-C, LCC-Win32 usw.
zur not tuts auch ein GCC (mingw).

für GUI anwendungen könntest du C#/VB/.NET oder Java nehmen. mit C geht 
es zwar auch, ist aber eine ganze ecke komplexer.

kostenlose sprachen wären dann noch Python (auch GUI fähig) und diverse 
BASIC und Pascal implementationen. es gibt verdammt viel kostenloses 
zeug, das kann man alles gar nicht aufzählen.
:-)

von Kai F. (k-ozz)


Lesenswert?

Ist in Delphi 5 programmiert. Das nutze ich sehr häufig für so kleine 
Programme, oder wenn es von der Arbeit her so sein soll. Größeres mache 
ich mittlerweile fast nur in C++.

Im Code steckt nicht viel drin, Port öffnen, Datei öffnen und alles was 
am Port reinkommt in die Datei schreiben. Die wichtigste Funktionalität 
steckt in eine COM-Port-Komponente, die das ganze Handling der 
Schnittstelle übernimmt. http://sourceforge.net/projects/comport/

Drum herum ist halt noch etwas Fehlerbehandlung.

von Martin M. (martin69)


Lesenswert?

Ich habe mir nun "Visual C++ 2005 Express Edition" bei Microsoft 
downgeloaded. Ich denke aber, daß man ohne fremde Hilfe bzw. ein gutes 
Buch nicht viel auf die Reihe bekommt. Bisher fehlt mir jeder 
Durchblick, wie das funktioniert....

Kennt jemand ein gutes Buch für Einsteiger von C++?

von Simon K. (simon) Benutzerseite


Lesenswert?

Martin Müller wrote:
> Ich habe mir nun "Visual C++ 2005 Express Edition" bei Microsoft
> downgeloaded.

Wenn du noch Sachen wie serielle Schnittstelle auslesen, musst du das 
PSDK installieren:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-143003.html

von Michael W. (wiebel42)


Lesenswert?

Martin Müller wrote:
> Ich denke aber, daß man ohne fremde Hilfe bzw. ein gutes
> Buch nicht viel auf die Reihe bekommt.

Schnapp dir doch einfach mal ein paar kleine OpenSource Programme, und 
pass mal ein paar Kleinigkeiten deinen Wünschen an (Menüs verändern oder 
so), sowas find ich super lehrreich.
www.sf.net ist dafür erstmal ne gute Anlaufstelle. -wiebel

von Martin M. (martin69)


Lesenswert?

Danke für die Antworten und Tipps. Ich werde mich mal bei Gelegenheit 
mit der Windows-Prgrammierung auseinandersetzen. Da fehlt mir gerade 
etwas die Zeit und Lust....

von Jankey (Gast)


Lesenswert?

ähm, da muss noch der Header der BMP Datei geschrieben werden sonst geht 
da garnix, eine Alternative dazu wäre sicher in Borland C oder in Delphy 
den sogenannten Canvas zu benutzen und einfach den Pixelstrom ( 
sozusagen ein Array ) in das Pixel Array des Canvas zu Transportieren 
...

hab mal vor vielen vielen Jahren einen eigenen PCX Generator 
programmiert der mir Fraktale erzeugt hat ... nunja was ich mich 
erinnern kann waren das so 128 Bytes an Headerinformationen wie Breite 
und Länge des Bildes sowie Farbauflösung und ob es eine Kompression gab 
( PCX is ja im prinzip nur ein BMP nur halt mit 192 Farbwerten 
funktioniert = 0xC0, alles darüber ist die anzahl der Folgenden 
"gleichen" farbinformation )

in borland würde es ca. so funktionieren (nix Quick & Dirty sondern 
Sauber):

for(x=0;x<xmax;x++)
for(y=0;y<ymax;y++)
Canvas.Pixels[x][y] = DatenArrayFromSerial[x+xmax*y];

Canvas.SaveToFile(AnsiString("Display.bmp"));

das Canvas schreibt dir dann völlig automatisch den Header und den 
Abschluss..

lg Jan

von Martin M. (martin69)


Lesenswert?

@Jankey:

der Header der Bitmap-Datei wird schon vom Controller erzeugt! Auf der 
PC-ist nur das Speichern der empfangenen Daten angesagt...

Gruß
Martin

von Mic M. (radbruch)


Lesenswert?

Kai F. schrieb:
> Ich habe dir grad mal fix ein kleines Programm geschrieben...

Danke. Das Programm funktioniert prima. Einziger Mangel: Die 
Einstellungen werden nicht gespeichert, aber damit kann man gut leben:
http://www.roboternetz.de/phpBB2/viewtopic.php?p=494573#494573

Gruß

mic

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

Ich benutze das Programm auch sehr gerne. Ich bin dem Programmierer auch 
sehr dafür dankbar.

Es wäre noch gut, wenn der Bytezähler gelöscht würde, wenn man eine neue 
Aufzeichnung startet. Dann würde man gleich anhand der Dateigröße sehen, 
ob die Daten alle angekommen sind (oder man einen Fehler sichen muß).

Anbei ein Bild einer Hardcopy eines Farbdisplays von Electronic 
Assembly. Ich erzeuge mit dem Conroller eine BMP-Datei, die ich zum PC 
schicke. Ich habe diese im Anhang beigefügt (mit PC zuvor als PNG 
gewandelt, da die BMP-Datei 256k hat).

Gruß
Martin

von Kai F. (k-ozz)


Angehängte Dateien:

Lesenswert?

Hatte grad zufällig das Programm selbst einmal verwendet und dacht mir 
ich schaue mal in diesen alten Thread wieder rein.
Tatsächlich gibt es einige Nutzer und ein paar 
Verbesserungsvorschläge/-wünsche.

Hier also einen neue Version mit folgenden Änderungen:
-Einstellungen (Port, Baudrate und Dateiname) werden in der Registry 
gespeichert
-Bytezähler wird zurück gesetzt, wenn einen neue Aufnahme gestarten wird

Ich hoffe, dass es für den Einen oder Anderen jetzt noch etwas 
nützlicher ist.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Wen du die Einstellungen dann nicht mehr in der Registry unterbringst, 
sondern im gleichen Ordner des Programms bzw. der aktuellen 
Projektdatei, dann biste mein Held. Auch wenn ich das Prog selbst nicht 
brauche.

Registry nur im Notfall!!!

von Kai F. (k-ozz)


Angehängte Dateien:

Lesenswert?

Naja, ich muß sagen, das Argument mit den verschiedenen Projekten hat 
was. Darum hier nochmal eine geänderte Version, die die Einstellungen in 
einer ini-Datei im Programmverzeichnis speichert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.