Forum: PC-Programmierung Drucker mit C#


von Jonas M. (tschortsch)


Angehängte Dateien:

Lesenswert?

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

von Sam .. (sam1994)


Lesenswert?

Beschreib doch mal genau was dein Drucker dann druckt. Und kommentier 
mal deinen Code, das macht ihn lesbarer.

von Jonas M. (tschortsch)


Angehängte Dateien:

Lesenswert?

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

von Arno Nyhm (Gast)


Lesenswert?

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! ;)

von Sam .. (sam1994)


Lesenswert?

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?

von Jonas M. (tschortsch)


Angehängte Dateien:

Lesenswert?

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

von Sam .. (sam1994)


Lesenswert?

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?

von Jonas M. (tschortsch)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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.

von Jonas M. (tschortsch)


Lesenswert?

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.

von bluppdidupp (Gast)


Lesenswert?

"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

von Jonas M. (tschortsch)


Lesenswert?

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!

von Jonas M. (tschortsch)


Lesenswert?

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

von Sam .. (sam1994)


Lesenswert?

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.

von Jonas M. (tschortsch)


Angehängte Dateien:

Lesenswert?

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

von Jonas M. (tschortsch)


Lesenswert?

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
Noch kein Account? Hier anmelden.
Lade...