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:
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
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
anscheinend geht die Übertragung los wenn CTS high wird?!
mag den logic analyzer jetzt nicht auspacken,..
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.
#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() {
}
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,..
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
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)