Ich habe die Tage die Anleitung AVR Bootloader in C ausprobiert, und mußte feststellen das die Anwendung zum übertragen des Anwendungscodes (Putty) unter Windows 7 nicht\nicht mehr funktioniert. http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung Deshalb habe ich mich als Laie hingesetzt und eine kleine Anwendung geschrieben, mit der der Bootloader beschrieben werden kann. Wenn es jemandem genauso geht ist hier das Programm : http://dieh.di.ohost.de/Programme/SBootloader/publish.htm Und für Verbesserungsvorschläge, Fehlerkontrolle oder Erweiterungen ist der Quellcode angehängt. Freue mich auf Kritik, DTCP
:
Verschoben durch Moderator
Bin gerade auch dabei ein Programm zu schreiben und habe deines mal getestet (ohne irgendwelche Änderungen und den Source Code zu studieren) Ich bekomme immer einen Fehler nach der Auswahl einer hex datei? "Ein Ausnahmefehler des Typs "System.FormatException" ist in mscorlib.dll aufgetreten. Zusätzliche Informationen: Die Eingabezeichenfolge hat das falsche Format." Werd mir das Programm mal genauer anschauen
:
Bearbeitet durch User
Hui, andere kritisieren, dass macht immer Spaß. Aber jetzt mal Ernst :) - die deutschen Namen sind nicht besonders gut. Dadurch, dass der Rest auf Englisch ist, wird das Lesen schwerer. Besonders "schlimm" sind die Kombinationen wie "tb_SeriellOut" und "seriellWriteLine" - "//Hexfile auslesen, Bytegröße berechnen, Fehlerabsicherung (MsgBox Datei zu groß)". Frei nach Scott Meyers Effective C++(kann man auch gut für C# verwenden :). Du machst zu viel in einer Methode. Besser, du teilst das in kleine Häppchen auf. Das macht den Quellcode übersichtlicher, leichter zu ändern und zu warten. - Das ist an der Stelle nicht Wichtig, aber für die Zukunft:
1 | // pseudocode |
2 | string complete = ""; |
3 | string hilfsstring = ""; |
4 | for (1 bis 1000){ |
5 | hilfsstring = irgendwas(); |
6 | complete += hilfsstring; |
7 | } |
Das wird schnell seeeeehr langsam, da complete jedes Mal komplett in einen neuen Speicherbereich kopiert und der alte vom GC freigegeben werden muss. Dafür gibt’s in C# den StringBuilder.
1 | // wieder pseudocode |
2 | StringBuilder complete = new StringBuilder(); |
3 | string hilfsstring = ""; |
4 | for (1 bis 1000){ |
5 | hilfsstring = irgendwas(); |
6 | complete.Add(hilfsstring); |
7 | } |
8 | daten = complete.ToString(); |
- ich hab das jetzt nicht wirklich ausprobiert. Du speicherst den Index der der ComboBoxen? Das würde bei mir nicht gut gehen. Durch diverse USB-Seriell Wandler steht da dann ein Zufälliger Port drin. - weiter zu den Boxen. Das mit den Schaltflächen für default ist unnötig. Speicher beim Beenden des Programms einfach den aktuellen Inhalt als String ab und lade den beim Neustart (inklusive Port existiert und wenn nicht, dann ersten Port anzeigen). Das ist in anderen Programmen gängig und entspricht einer gewissen Erwartungshaltung. - ReadConvertHexFile gibt bei dir ein Byte Array zurück. Das kannst du dir sparen. gib an der Stelle einfach ein string Array zurück, in dem die eingelesenen Zeilen stehen. Da tust du dich leichter.
1 | // einlesen |
2 | string []allLines = File.ReadLines(pfad); |
3 | |
4 | // später auf den Port ausgeben |
5 | foreach(var oneLine in allLines){ |
6 | serialPort.Write(oneLine); |
7 | } |
- Noch mal zu den Namen. Überlege Dir bessere :) "bytes" ist etwas ungenau da könnten auch die daten in einem Array drin stehen. byteCount wäre da schon besser. "Nebenthread" ist auch nichtsssagend. Da musst du dir noch etwas besseres ausdenken. Du kannst auch am Anfang den erstbesten Namen, solltest doch später noch mal drüber nachdenken. Das ist mal wichtig, wenn du ein halbes Jahr den Code nicht siehst, dann stolperst du über so was. - So weit ich den Artikel überflogen habe, ist der Bootloader ja ziemlich geschwätzig. Du solltest diese Sachen auswerten. Ich habe Testweise mal ein hexfile an einen Port gesendet, an dem nichts angeschlossen war. Lief gut durch :) - Wozu sind die Textbox und der Senden button gut? Der Ansatz ist gut. Statt dem Senden Button kannst du einen wähle Datei Button machen, der deinen OpenFile Dialog aufmacht. Das Ergebnis vom dialog schreibst du dann in die Textbox(die du beim Verlassen des Programmes gerne mit abspeichern kannst). der Starte Flash Vorgang liest nun die Datei aus dem Textfeld ein und bemängelt maximal, dass er die Datei nicht finden konnte, oder dass nichts drin steht. Dann brichst du wieder ab und der Anwender kann sich die Datei raussuchen. - Das mit dem Port extra öffnen kannst du dir auch sparen. Mach ihn auf, wenn du flashen willst und danach wieder zu. Beachte, dass der Port auch gerne mal von einem andern Programm belegt sein kann. Stichwort try/catch/finally. So, das wars fürs erste. Mir fällt zwar noch mehr auf, aber mir bluten schon die Fingerkuppen ^^ Grüße,
Ach, ganz vergessen. Wenn du das mit dem Prgogrammieren weiter ausbauen willst, kann ich nur das Buch "Weniger schlecht programmieren". Der Titel ist total bekloppt, aber der Inhalt ist sehr gut. Einfach mal beim Amazon suchen. Grüße,
Das Programm ist nur auf die schnelle entstanden, damit es mit dem Tutorial weitergehen konnte. Ursprünglich stand dieser Beitrag für Verbesserungsvorschläge auch in "PC-Programmierung" bevor er verschoben wurde. Eineinhalb Jahre später hat es nun doch noch jemand getan :) Bubba Long schrieb: > Ich bekomme immer einen Fehler nach der Auswahl einer hex datei? Den Fehler kann ich nicht nachvollziehen. Dazu müßte man mal die Hexdatei sehen. Vermute aber das es an der Bytegrößenberechnung liegt. @ nicht"Gast" Danke dir erstmal für deine Mühe, ist nur schade das es nicht die aktuelle Version war. ( ein wenig Komplexer, mit FileWatcher, einer eigenen Klasse für die Hexdatei etc.) Die Benennungen der Funktionen sind wirklich grausig, da gibt es bei mir (immer)noch keine einheitlichen Konventionen. Das mit dem StringBuilder ist ein guter Tipp, allerdings wurde es in der letzten Version einfach durch File.ReadAllLines(pfad) ersetzt, wodurch das Problem beseitigt wurde. Das man die Hexfile senden kann obwohl nichts angeschlossen ist ist natürlich alles andere als schön. Die Textbox mit dem Sendebutton hat den Zweck Zeichen an den Mikrocontroller zu übermitteln, dies ist bei einigen nötig um in den Bootloader zu gelangen. Ein gutes Buch liegt auf dem Schreibtisch, leider kam immer was dazwischen. Zu wenig Zeit, keine Lust, oder was am schlimmsten war zwischendurch für die Mikrocontrollerprogrammierung noch ein wenig GCC lernen. Wie dem auch sei weiterentwickelt wird es sowieso nicht mehr, irgendwo in den Untiefen von "Projekte & Code" hatte schon mal jemand ein sehr gutes Programm für den Zweck zur Verfügung gestellt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.