Hallo,
das ist mein erster Post. Bisher konnte ich mir immer selbst irgendwie helfen. Diesesmal bräuchte ich etwas Unterstützung bei meinem Problem. Ich möchte einen Nadeldrucker DL3700 mit einem Arduino Mega ersetzen und den am Arduino Mega empfangenen Text bearbeiten/formatieren sodass ich diesen auf einem Display anzeigen kann.
Der Master sendet im 25 Sekunden Takt die Sequenz STX,ENQ,ETX an den Drucker die ich mit einem ACK als Rückantwort bestätigen muss damit der Master nicht auf Störung geht.
Wenn eine Nachricht an den Drucker gesendet wird fängt die Sequenz mit STX,ESC,r,NUL an worauf die Nachricht in mehreren Zeilen ausgegeben wird. Ende jeder Zeile ist mit CR,LF und der Anfang der nächsten Zeile beginnt mit einem ETX worauf ich mit einem ACK antworten muss damit die nächste Zeile vom Master gesendet wird. Pro Nachrichtenzeile kommen 80 Zeichen rein wobe CR,LF nicht eingerechnet wird.
Da ich Anfänger bin, bin ich gerade am herumprobieren und versuche mich in die Serielle Schnittstelle einzuarbeiten. Generell, Code lesen und verstehen kann ich zu 60%.
Mein Codeschnipsel mit dem ich gerade arbeite sendet das ACK auf die Anfrage STX,ENQ,ETX vom Master zurück, das klappt. Leider klappt der zweite Teil mit der Sequenz STX,ESC,r,NUL nicht.
//**********************************************************************************
//Printer Emulator
#include <Arduino.h>
char Request_Printer[2]={0x0002,0x0005}; // Master sends "STX,ENQ,ETX" and requests "Is Printer connected?
char ETX[1]={0x0003};
char MSG_start[3]={0x0002,0x001b,0x0072}; // Master sends "STX,ESC,r,NUL" That´s the Message Startcondition
char NUL[1]={0x0000};
void setup() {
Serial1.begin(4800, SERIAL_7E1); // Set Baud Rate, Data Bits, Parity and Stop Bit
}
void loop() {
if (Serial1.available()> 0) // Check if something in the UART RX Buffer
{
if(Serial1.findUntil(Request_Printer, ETX)) { // Test the received buffer for "STX,ENQ,ETX"
Serial1.print("ACK"); /* If Received Data contains "STX,ENQ,ETX", give an "ACK" back
so the Sender knows the "Printer" is still connected */
}
if(Serial1.findUntil(MSG_start, NUL)) { // Test the incoming Data for "STX,ESC,r,NUL"
Serial1.print("MSG Start"); // If there is an match on "STX,ESC,r,NUL" just print "MSG Start"
}
}
}
Kann mir jemand sagen warum der zweite Teil nicht klappt?
Wie würdet Ihr die "Aufgabe" strategisch lösen?
Damit meine ich z.b. (so in etwa dachte ich)
- Buffer anlegen 10 Zeichen lang für Sequenzen
- Buffer anlegen 100 Zeichen lang für Nachrichten
- immer nach vier eingegangenen Zeichen im Buffer_10 nach den Sequenzen STX,ENQ,ETX und
STX,ESC,r,NUL suchen.
if STX,ENQ,ETX -> sende ACK
if STX,ESC,r,NUL speichere alle eingehenden Zeichen in den Buffer 100 und gib diese an das
Display aus.
Beste Grüße,
mnemonic
