Hey Leute, bin jetzt schon seit Ewigkeiten am rumrätseln und finde einfach meinen Fehler in dem im Anhang liegenden C#-Code nicht. Es handelt sich um ein Programm, dass einen Mikrocontroller ansteuert (µc-Programm ist auch im Anhang). Zum Prinzip: Jedes mal, wenn der Mikrocontroller den letzten befehl des PC's ausgeführt hat, schickt er ein "R" zurück, woraufhin der PC den nächsten Befehl sendet. In der Theorie klappt's ganz gut und mit Diagnose-Programm druckt er auch einwandfrei (Programm des µc scheint in Ordnung zu sein). Aber mit dem normalen Druckprogramm klappts einfach nicht =[ Der Fehler müsste irgendwo in der Methode abschnitt_drucken() stecken... Hoffentlich könnt ihr mir helfen. Danke. Gruß Jonas
Beschreib doch mal genau was dein Drucker dann druckt. Und kommentier mal deinen Code, das macht ihn lesbarer.
Samuel K. schrieb: > Beschreib doch mal genau was dein Drucker dann druckt. Und kommentier > mal deinen Code, das macht ihn lesbarer. Ok, also habe mal das Wesentliche aus dem Quellcode rauskopiert und kommentiert. Prinzip des Druckers steht im Quelltext dabei. Außerdem habe ich mal zwei Bilder von dem Drucker hochgeladen, damit ihr euch ne Vorstellung davon machen könnt. Hoffentlich könnt ihr mir jetzt helfen :) Gruß Jonas
Es hilft Dir zwar nicht bei Deinem Problem, aber großes Lob für diesen Lego-Plotter! Das ist eine wirklich kreative und gleichzeitig lustige, doch gut umgesetzte, Sache! ...meinen Respekt! ;)
Ich hab beim überfliegen keinen Fehler gefunden. Was du machen könntest ist in der Konsole oder einer TextBox die Befehle ausgeben und schauen was falsch gemacht wird. Was druckt der Drucker eigentlich mit dem jetzigen Programm?
Samuel schrieb: > Ich hab beim überfliegen keinen Fehler gefunden. Was du machen könntest > ist in der Konsole oder einer TextBox die Befehle ausgeben und schauen > was falsch gemacht wird. > > Was druckt der Drucker eigentlich mit dem jetzigen Programm? Er druckt Bilder im JPEG-Format. Ich häng einfach mal noch das Steuerprogramm mit an - der Vollständigkeit halber :D Also der drucker funktioniert wie gesagt. Habe alle Befehle mit nem Diagnoseprogramm getestet. Trotzdem danke, Jonas
Ich meine damit, was läuft falsch wenn du z.b. eine vertikale Linie Drucken willst. Häng mal ein Bild von dem an was dann gedruckt wird. Du willst etwas drucken, der Drucker druckt doch dann etwaws anderes. Wie sieht das aus?
Samuel schrieb: > Ich meine damit, was läuft falsch wenn du z.b. eine vertikale Linie > Drucken willst. Häng mal ein Bild von dem an was dann gedruckt wird. Du > willst etwas drucken, der Drucker druckt doch dann etwaws anderes. Wie > sieht das aus? Er druckt leider garnichts... Warum auch immer... Er fährt den Schlitten 2-3 mal hin und her ohne den Stift abzusetzen und steht dann still. Breche ich den Druck dann ab (ein "E" wie Ende wird an µc gesendet) führt er diesen Befehl vollkommen Problemlos aus.
Jonas M. schrieb: > Samuel schrieb: >> Ich meine damit, was läuft falsch wenn du z.b. eine vertikale Linie >> Drucken willst. Häng mal ein Bild von dem an was dann gedruckt wird. Du >> willst etwas drucken, der Drucker druckt doch dann etwaws anderes. Wie >> sieht das aus? > > Er druckt leider garnichts... Warum auch immer... Er fährt den Schlitten > 2-3 mal hin und her ohne den Stift abzusetzen und steht dann still. > Breche ich den Druck dann ab (ein "E" wie Ende wird an µc gesendet) > führt er diesen Befehl vollkommen Problemlos aus. Breakpoints an die passenden Stellen in PortDataReceived und abschnitt_drucken setzen (MessageBox-Aufrufe entfernen) und laufen lassen... p.s. in der ISR auf dem Controller sollte man besser auf solche riesigen delays verzichten und stattdessen mit Timern arbeiten.
Arc Net schrieb: > Jonas M. schrieb: >> Samuel schrieb: >>> Ich meine damit, was läuft falsch wenn du z.b. eine vertikale Linie >>> Drucken willst. Häng mal ein Bild von dem an was dann gedruckt wird. Du >>> willst etwas drucken, der Drucker druckt doch dann etwaws anderes. Wie >>> sieht das aus? >> >> Er druckt leider garnichts... Warum auch immer... Er fährt den Schlitten >> 2-3 mal hin und her ohne den Stift abzusetzen und steht dann still. >> Breche ich den Druck dann ab (ein "E" wie Ende wird an µc gesendet) >> führt er diesen Befehl vollkommen Problemlos aus. > > Breakpoints an die passenden Stellen in PortDataReceived und > abschnitt_drucken setzen (MessageBox-Aufrufe entfernen) und laufen > lassen... > > p.s. in der ISR auf dem Controller sollte man besser auf solche riesigen > delays verzichten und stattdessen mit Timern arbeiten. Danke mal für die Antwort. Also die MessageBoxen hatte ich nur für die Diagnose eingefügt. Damit ich wenigstens nachvollziehn kann bis zu welcher Zeile er kommt (übrigens bis zur 5. warum auch immer). Aber auch ohne die funktioniert es nicht. Kannst du mir erklären, warum ich das mit Timern machen soll? Man soll ja die ISR relativ kurz halten, damit das Programm dann schnell weiter laufen kann. In meinem Fall ist die ISR selbst ja das Programm. Deswegen dachte ich, das das kein Problem geben wird.
"The DataReceived event is not guaranteed to be raised for every byte received. Use the BytesToRead property to determine how much data is left to be read in the buffer. " Wird zwar hier wohl keine Auswirkungen haben, aber ich erwähne es trotzdem mal ;D
1 | void PortDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) |
2 | {
|
3 | while (port.BytesToRead>0) |
4 | {
|
5 | byte[] bytes = new byte[1]; |
6 | string text = port.Read(bytes, 0, 1).ToString(); |
7 | |
8 | MessageBox.Show("PORT:"+text); |
9 | MessageBox.Show("Zeile:"+zeile.ToString()); |
10 | |
11 | if(zeile == höhe-1) |
12 | {
|
13 | port.Write("E"); |
14 | }
|
15 | else
|
16 | {
|
17 | abschnitt_drucken(); |
18 | }
|
19 | }
|
20 | }
|
Die SerialPort-Klasse hat übrigens auch .ReadByte() und .WriteByte() - Wo du da öfters nen 1-Byte großes byte-Array nimmst ;D
bluppdidupp schrieb: > Die SerialPort-Klasse hat übrigens auch .ReadByte() und .WriteByte() - > Wo du da öfters nen 1-Byte großes byte-Array nimmst ;D Stimmt macht eigentlich Sinn :D Werd's ändern. Ich meld mich, wenn ich ihn nochmal getestet hab!
So, habe mal versucht, ob es klappt, wenn ich den Puffer komplett leere (wie von bluppdidupp vorgeschlagen). Hat leider nicht funktioniert. Das Problem ist immer noch das selbe. Ich sende ja ohnehin immer nur ein Byte vom µc aus, also is der Puffer ja sowieso geleert, wenn ich ein Byte auslese. Spielt jetzt aber eh keine Rolle mehr, da er jetzt ja auf jeden Fall komplett ausgelesen wird. Noch wer ne andere Idee? Langsam glaube ich, dass es einfach mit meinem Konzept nicht funktioniert =[ Gruß Jonas
Arc Net schrieb: > hnitt_drucken setzen (MessageBox-Aufrufe entfernen) und laufen > lassen... > > p.s. in der ISR auf dem Controller sollte man besser auf solche riesigen > delays verzichten und stattdessen mit Timern arbeiten. Du musst das Programm gescheit debuggen. Gib mal alle Zeichen in einer TextBox aus, die du sendest. Und schaue was falsch gemacht wird.
So, habe mir eine Log-Funktion ins Programm mitreingeschrieben. Die schreibt jetz die wichtigen Sachen in eine Textdatei. Im Anhang hab ich einen entsprechenden Log hinterlegt. Bis Zeile 49 stimmt alles. Bis dahin ist das entsprechende Bild nämlich weiß. Aber sobald eine Zeile schwarz und weiß enthält macht er Mist. Dem Log kann ich entnehmen, dass es irgendein Problem beim Auslesen der Pixel gibt. Worin das liegt, keine Ahnung.. Hat jemand vielleicht einen Rat? Grüße und Danke Jonas
Also, der Drucker läuft jetz bist auf einige Bugs. Vielen Dank an alle die mir geholfen haben! Grüße Jonas
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.