Serielle Datenübertragung DTR / RTS

Grüß euch!

ich möchte daten von einer SD Karte auf die serielle Schnittstelle übertragen, mit dem Seriellen Monitor der Arduino IDE funktioniert das flawless, nur nicht mit der Maschine mit der ich mich verbinden möchte,.

genauer gesagt geht es da um Hardware aus 1985 / eine CNC Maschine die ein Programm aus einem Textfile per Serieller Schnittstelle hochgeladen bekommen soll...

Ich vermute mal dass ich DTR RTS CTS oder und DSR benötige,.. finde dazu aber nichts brauchbares,..

hier mal mein code

#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(19200);


//while (!Serial) {
//; // wait for serial port to connect. Needed for native USB port only
//}

if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}

File dataFile = SD.open("data.txt");

// if the file is available, write to it:
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
}
else {
  Serial.println("error opening datalog.txt");
}
}

void loop() {
}

hier noch ein paar Einstellungen von der Software mit der die Übertragung klappt:

image
image
image

wie ich stopbits und parität in das programm bekomme weiß ich auch nicht wirklich, ich habe commands gefunden, aber keine doku bzw example code

weiß da jemand was?

LG

2 Likes

Versuch mal:
Serial.begin(19200, SERIAL_7E1);
Und für den super dokumentierten Einstieg gibts nen ++ :wink:

hat zwar das problem dass die Maschine nicht auf "empfang" schaltet nicht gelöst aber zumindest sieht das was ich am seriell Monitor sehe nun so aus wie das was die Maschine auswirft,..

damit hast du mir wohl meine nächste Frage beantwortet :)))

ich habe irgendwas mit dem reset pin gefunden, aber komme da nicht wirklich weiter,...

wenn ich daten mit der Software übertrage muss ich vorab bei der Software auf "senden" drücken dann geht diese in "wartestellung" bis ich bei der Maschine dann "Data Input" drücke dann rattert es los,..

da muss wohl ein physisches signal ran!?`

Software wartet
image

image

anscheinend geht die Übertragung los wenn CTS high wird?!
mag den logic analyzer jetzt nicht auspacken,..

danke für die Hilfe!

man tut wo mann kann :slight_smile:

Ja manchmal kommt die Antwort vor der Frage :wink:

Naja, das kann ja nicht gehen, denn Du hast nur RX und TX.
Die Leitungen DTR / RTS hast Du nicht.

Du kannst das aber selbst nachbilden.
Am Arduino einen PIN auf HIGH setzen das wäre Deine Leitung DTR - und wartest auf einem weiteren PIN das die Leitung DSR HIGH wird.
Dann kannst noch einen PIN HIGH setzen, das wäre Deine nächste Leitung: RTS - und dann schickst Die Daten auf die Leitung, wenn auf der Leitung CTS ein HIGH Pegel steht.
Wenn Du fertig bist mit senden, low ziehen - fertig.
Sprich: brauchst 4 Pins...

Noch 'n Nachtrag...
Du könntest auch versuchen das nur mit 2 Pins zu machen.
Pin1: HIGH ziehen und bildest damit DTR UND RTS ab. - Also eine Leitung hin und an der Maschine beide Eingänge HIGH setzen.
Die Rückleitung wäre dann nur CTS - Du stellst ja manuell den Empfang an der Maschine.

So haben wir das früher (TM) auch gemacht...

Streht da was von einer Steuerung Philips CNC 3000?

Welche Optionen bietet die Datenflußkontrolle?

Kennst Du Arduino Hardware Serial with RTS/CTS Flow Control?

ich bin mal ein Stück weiter,

anscheinend macht es das nach jedem byte (oder bit?)

over all sieht das dann so aus,

zum timing, sample start 0s, drücke am PC auf senden 2s, drücke bei der Maschine auf empfang 4s

gute Idee - da wäre folgendes möglich

image

damit hatte ich mich noch nicht beschäftigt, ist noch ein bisschen ein spanisches Dorf der arduino und die serielle Kommunikation,..

ich check mal was passiert wenn ich das umstelle :slight_smile:

Dann wäre das kürzeste Variante2.
IMHO musst Du dann vorher an der Steuerung auf Empfang schalten und erst dann beginnen zu senden.

also jetzt schalte ich auf der Maschine zuerst auf empfangen, dann starte ich die SW die übertägt dann "ohne Rücksicht auf Verluste"

mit dem Arduino geht das natürlich NOCH nicht!

#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;
int CTS = 0;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(19200, SERIAL_7E1);
  pinMode(2, INPUT);    // CTS Pin
  pinMode(13, OUTPUT);  // LED


  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }

  File dataFile = SD.open("data.txt");


  if (dataFile) {   //wenn das file gefunden wird


    delay(1000);

    CTS = digitalRead(2);   // CTS lesen an PIN2

    while (dataFile.available() && CTS == HIGH) {

      digitalWrite(13, HIGH);         // LED an
      Serial.write(dataFile.read());  // Daten senden
    }

    dataFile.close();
    digitalWrite(13, LOW);         // LED aus
  }
  else {
    Serial.println("error opening datalog.txt");
  }
}

void loop() {
}

bin jetzt mal weiter, die Maschine erkennt mal dass was dahger kommt, meckert aber

wenn ich als ASCII einlese (satz zu lang)
wenn ich als ISO einlese (partitätsfehler)

parität kann ich wie ändern?

ahhh! ich brauch ein invertiertes Signal,...

ohh nööööö! wieso das denn jetzt?!

hat da jemand ne ahnung wie ich das anstelle?

PC Signal

Arduino Signal

Du hast oben als Ende \13 und \10 für Zeilenende.
Wie sieht denn Dein File aus?
Ist da evtl. nur ein \10 drin?....

so sieht das file aus,

%PM8003
N8003 (Test 3 750kb)
N10 (T1  D=12 CR=0 TAPER=90deg - ZMIN=-11.67 )
N20 (T6  D=10 CR=0 TAPER=90deg - ZMIN=-24 - N)
N30 (T15  D=10 CR=0 - ZMIN=-21 - Schaftfraser)
N40 (T54  D=10 CR=0 TAPER=118deg - ZMIN=-23 -)
N50 G81
N60 G90
N70 G17
N80 G71
N90 (Planen1)
N100 M9
N110 T15 M6
N120 S1600 M3
N130 G54
N140 M8
N150 G0 X12.769 Y-4.875
N160 Z15
N170 Z5
N180 G1 Z0 F300
N190 G3 X11.769 Z-1 I11.769 K0
N200 G1 X11.5
N210 X-11.5
N220 G2 X-11.5 Y2.506 I-11.5 J-1.185
N230 G1 X11.5
N240 G2 X12.5 Z0 I11.5 K0
N250 G0 Z15
N260 G17
N270 (2D Adaptive1)
N280 S4000 M3
N290 M8
N300 G0 X-27.55 Y-26.352
N310 Z15
N320 Z-1
N330 M9
N340 M30
N350 

das heißt das muss noch umcodiert werden,..

schaffen wir das über den arduino?

das größere problem ist eher das invertierte Signal,.. verlassen wir uns besser nicht drauf dass der Fehler den die Maschine anzeigt "satz zu lange" dass dabei auch ein vernünftiger Satz ankam,..

data.h (670 Bytes)

mach aus dem .h bitte ein .txt das foum lässt mich keine text oder rar datei hochladen..

1 Like

Kannst Du mir das mal als Anhang ranhängen?
oben einfach in dem Post ändern.

1 Like

Ne. Passt. Die ersten zwei Zeilen :wink:

21:40:30.121 -> 25 50 4D 39 30 30 33 D A 
21:40:31.116 -> 4E 39 30 30 33 20 28 54 65 73 74 20 33 20 37 35 30 6B 62 29 D A 

Kann es sein, das Du RX und TX am Arduino vertauscht hast?

hab immer beides probiert,..

anfangs hat es mich irritiert dass die RX LED am arduino immer an geht sobalnd man es verbindet, aber das scheint so zu passen, denn wie man am logic analyzer sieht sind RX und TX bei irgend einem screenshot vertauscht,

also ja wurde vertauscht, aber sozusagen gewollt, habe immer beides ausprobiert da mich wie gesagt die leuchtende RX LED anfangs irritiert hat und ich dachte - das kann ned sein - ist aber so...

ich glaube es it etwas untergegangen, was sich auch mit der dauerhaft leuchtenden LED deckt - das Signal das ich am Logicanalyzer gewandelt bekomme ist ->INVERTIERT! <- ich glaube das einfachste wird sein einen LS oder HCT04 auszugraben, und damit die beiden Signale einfach zu invertieren..

software mäßig stelle ich mir das aufwendig vor, oder gibt es die funktion in der library ?

Wenn Du von der Maschine die Daten bekommst und der Arduino die ausgibt, ist die Logik richtig.
Was hast Du da für ein Arduino dran?
Ich denke eher, das es (wieder mal) ein Konflikt zwischen SerMon und RX/TX auf DigitalPin 0/1 ist.

Zieh mal das USB-Kabel ab und versorge den Arduino über die Hohlbuchse.
Maschine auf Emfang stellen und resetTaste am Arduino drücken.

Wenns beim ersten Mal nicht geht, wenigstens noch einmal und dann ggfls. RX/TX tauschen - zweiter Versuch.
Wenns dann nicht, bin ich erstmal überfragt ;(

das habe ich sowieso immer so gemacht, das Problem ist mir bekannt :confused:

am anfang habe ich noch die 5V aus der Maschine genommen, jetzt bastle ich mir gerade ein breadboard mit 74LS04 (fun fact, ich habe einen Sack mit 30 ICs ausgeleert - und once in a life time habe ich einen 04er rausgezogen beim ersten griff)

ich bastle mal meinen inverter

:slight_smile:
Ok - ich muss heute aber Schluß machen...
Ich bin noch am überlegen... Wenn Du was hast, sag Bescheid.