Serial Monitor warum gehts nicht ?
-
Hallo
also ich versuche mir ein Com monitor zu basteln der mit meine Daten einfach in eine txt mitschreibt.
Das Problem ist ich bekomme es einfach nicht richtig zum laufen.
die TXT die ich erstelle geht nur die daten sind nicht richtig dort stehen immer nur 2 zeichen auch mal 3 zeichen drin !!
TXT(list)
LOGGER COM 1
? @$ ?
TXT LIST endeISt nicht viel oder?
ok ich habe mich an diese Seite gehalten
http://www.easysw.com/~mike/serial/serial.html#2_5
doch komme ich nun einfach nicht weiter auch habe ich das Problem in ein anderen Forum schon erfragen wollen doch kennt keiner die Antwort
Nun hoffe ich sehr das Ihr dort etwas besser wisst und mir Helfen könnt.
Hier mal der code////////////////////////////////////////////////////////////// /////////////include für serial aus dem Internet////////////// #include <iostream> #include <cstdio> #include <fstream> #include <sstream> #include <cstdlib> #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// using namespace std; int fd; // File descriptor Serial struct termios options; int open_port(void) { ///dev/ttyS0 fuer com1 ////dev/ttyS1 fuer com2 fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);// öffne()' - port1 fcntl(fd, F_SETFL, 0); tcgetattr(fd, &options); /* set raw input, 1 second timeout */ /* * Set the baud rates to 9600... */ cfsetispeed(&options, B9600); options.c_cflag |= (CLOCAL | CREAD); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10; /* set the options */ tcsetattr(fd, TCSANOW, &options); if (fd == -1) { // wenn ich denn port nicht öffnen kann perror("\nCOM1: PORT IST ÖFFEN /dev/ttyS0 - "); } else { printf("\nVerbindung wurde erfolgreich hergestelle"); } return (fd); } /*void close_port() { close(fd); //schliesst port soll aber nicht } */ ///////////////////// Hauptprogramm ////////////////////////// int main(int argc, char* argv[]) { int status; char retval; char buffer[100]; ssize_t size; //////// VERSUCH 2 ///////////////// /* size = read(status, buffer, 99); if (size > 0) { buffer[size] = '\0'; printf("\n%s", buffer); } ///////////////////////*/ status=open_port(); if (status != -1) { fcntl(status, F_SETFL, FNDELAY); while (size > 0) //oder so !!!!!!! // while(retval!=-1) { size = read(status, buffer,255);//buffer leider nur 255 zeichen im mom if (size > 0) { buffer[size] = '\0'; printf("\n%c", buffer); } } // close_port(); // port schliessen hört auf zu loogen // printf("\n\nVerbindung wurde getrennt\n"); } ///////////////////////////Ausgabe///////////////////////////// ofstream output("/home/cooper3210/Documents/logger.txt"); // Fehler abfangen if (!output) { cout << "Fehler beim Erstellen der Datei!\n"; exit (1); } cout << "LOGGER DATEIN SCHREIBEN \n"; output << " LOGGER COM 1 " << endl; output << buffer << endl; // buffer in datei schreiben retval=getchar(); // warten auf enter !!! }
also ich denke der fehler liegt hier!!!!!!!!!!!
cfsetispeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
dort sehe ich einfach nicht durch und die erklärung ist auf der webseite auch nicht so toll
Vielen dank für eure hilfe!!Nee einfache com verbindung
bis/sek 9600
datenbit 8
parität keine
stopbits 1
flusssteuerung hardwareCu mfg cooper/fuller
-
options.c_oflag &= ~OPOST;
was bedeutet das? ist das c++
-
auf OPOST wird das Einer-Komplement angwendet(also bitweise aus 1 wird 0, aus 0 wird 1) und das Ergebnis mit c_oaflag mit dem logischen UND verbunden(also 1 u. 1 = 1, alles andere 0, wieder bitweise natürlich)
-
das ist zur Nachbearbeitung für denn ausgang !! laut der Webseite
nur wie das so richtig verstanden werden soll ist eben so mein Problem!
eben dort denke ich liegt der Fehler und ich sehe dort nicht durch LEIDER!also ich versuch mal das Reading Data from the Port bissel besser zu verstehen
also fcntl(fd, F_SETFL, FNDELAY); würde nichts tun wenn beim auslesen keine buchstaben vorhanden sind!
fcntl(fd, F_SETFL, 0); würde alles mitnehmen was über denn port kommt!
Also sollte er normal alles mitschreiben ? Das muss ich nicht verstehen
Somit gehen erst mal alle datein rein und können auch geschrieben werden .Da liegt der fehler auch nicht dort!
Daten liegen auch 100% an !! mist muss das jetzt mal umbasteln das er die daten erst mal in einer konsole ausgibt damit ich sehen kann was er mach. und wo es nicht weiter geht.cu cooper
-
!!!!Was ich eben feststellen musste ist das ich als Linux root bissel mehr kommt in meiner txt aber auch nicht so das ich sagen würde das ist ok.
Kann unter win nicht testen!!!!
wäre ja möglich das es an denn rechten liegt aber die txt liegt im user Bereich also könnte er sie normal schreiben .Was mir auch noch eine erklärung wäre ist sie Sache mit dem buffer da ich die Daten erst nach buffer schreibe könnte es möglich sein das er dort abbricht !!
Mist wenn es schon geht wieso dann nicht so wie es soll ist doch blöd wenn man keine Fehlermeldung hat lol
CU
-
Also viel kommt nicht!!!
EXECUTING:
/home/cooper3210/Documents/Projekte/COMTERMINAL/Terminal
----------------------------------------------COM1: PORT IST ÖFFEN /dev/ttyS0 - : Bad file descriptor
LOGGER DATEIN SCHREIBEN
?y @4?????
nicht mehr wie in meiner txtich denke der fehler liegt in der verbindung ich hatte sowas mal in ein normal terminal wo die bisrate auf 2200 stand und das könnte hier der fall sein !
Doch ich denke mal ich gebe doch die richtige bitrate an mit cfsetispeed(&options, B9600);
und das endgerät arbeitet auf 9600 also sollte es ok sein.
-
Hi noch mal
also ich habe rausgefunden das ich mit minicom erst mal meine com prüfen muss und diese einstellung machen muss!!
* /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 * /dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3 * einstellungen mit minicom auf No parity (8N1): meine einstellungen */ /* UNIX 8N1 meine serial einstellung */ tcsetattr(fd, TCSANOW, &options); cfsetispeed(&options, B9600);// bits pro sek options.c_cflag &= ~PARENB; // noch kein Plan ? options.c_cflag &= ~CSTOPB; // noch kein Plan options.c_cflag &= ~CSIZE; // noch kein Plan options.c_cflag |= CS8; // stop Bits 8 options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10;
so normal sollte das jetzt auch richtig sein oder???
cu cooper////////////////////////////////////////////////////////////// /////////////include für serial aus dem Internet////////////// #include <iostream> #include <cstdio> #include <fstream> #include <sstream> #include <cstdlib> #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ ///////////////////////////////////////////////////////////// using namespace std; ///////////////////////////////////////////////////////////// int fd; // File descriptor Serial struct termios options; int open_port(void) { /* dev/ttyS0 fuer com1 dev/ttyS1 fuer com2 */ fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);// öffne()' - port1 fcntl(fd, F_SETFL, FNDELAY); tcgetattr(fd, &options); /* set raw input, 1 second timeout * Set the baud rates to 9600... * /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 * /dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3 * einstellungen mit minicom auf No parity (8N1): meine einstellungen * UNIX 8N1 meine serial einstellung */ tcsetattr(fd, TCSANOW, &options); options.c_cflag &= ~CRTSCTS; cfsetispeed(&options, B9600);// bits pro sek options.c_cflag &= ~PARENB; // noch kein Plan ? options.c_cflag &= ~CSTOPB; // noch kein Plan options.c_cflag &= ~CSIZE; // noch kein Plan options.c_cflag |= CS8; // stop Bits options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10; if (fd == -1) { // wenn ich denn port nicht öffnen kann perror("\nCOM1: ERROR kann Port nicht Öffnen!! /dev/ttyS0 - "); printf("\n ACHTUNG PROGRAMM BITTE ALS ROOT AUSFÜHREN!!\n\n"); } else { printf("\nVerbindung wurde erfolgreich hergestelle"); } return (fd); } /* void close_port() { close(fd); //schliesst port soll aber nicht } */ ///////////////////// Hauptprogramm ////////////////////////// int main(int argc, char* argv[]) { int status; char retval; char buffer[255]; ssize_t size; status=open_port(); if (status != -1) { fcntl(status, F_SETFL, FNDELAY); cout << "\n vor while " << buffer ;//test while (size > 0) //oder so !!!!!!! // while(retval!=-1) { cout << "\nvor size " << buffer ;//test size = read(status, buffer,255);//buffer leider nur 255 zeichen im mom if (size > 0) { buffer[size] = '\0'; printf("\n%c", buffer); cout << "\n nach \n%c " << buffer ;//test } } /*close_port(); // port schliessen hört auf zu loogen printf("\n\nVerbindung wurde getrennt\n"); */ } ///////////////////////////Ausgabe/in log datei///////////////////////// /* erstellen der log datei */ ofstream output("/home/cooper3210/Documents/logger.txt"); if (!output) // Fehler abfangen { cout << "Fehler beim Erstellen der Datei!\n"; exit (1); } cout << buffer; // test cout << "\n\n"; cout << "LOGGER Daten in eine Datei schreiben!!! \n" << buffer; output << " LOGGER COM 1 " << endl; output << buffer << endl; // buffer in datei schreiben ////////////////// Programm ENDE //////////////////////////////////// retval=getchar(); // warten auf enter !!! }
-
Hi
also ich habe heute mal gtkterm in mein Linux system aufgenommen und damit getestet ob meine com 1 ok ist.
Also das ist lustig denn die gleichen einstellung wie ich sie mache Gehen dort !!!
ich verstehe nicht wieso es dann bei mir nicht mal denn Versuch macht zu laufen.
Ist echt schade das ich nicht weiter komme das ganze sollte normal noch erweitert werden.ok cu cooper
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Im Forum findest du hier u. a. ein Beispielprogramm von mir, das die Daten von der seriellen Schnittstelle ausgibt. Wenn du hier printf() durch fprintf() ersetzt (mit deiner TXT-Datei als stream), landen die Ausgaben in deiner Datei.
Martin