C++/Linux: RS232 (Serieller Port)
lima-city → Forum → Programmiersprachen → C/C++ und D
ausgeben
bestimmte signale
buffer
code
dank
datum
einlesen
ersetzte code
file
gleichen buffer
hardware
http
kommunikation
pointer
port
programm
serielle schnittstelle
skriptum
stimmen
url
-
In der Schule / Handwerk Elektronik haben wir seit einiger Zeit mit PICs herumprogrammiert. Da dieser auch eine Kommunikation über RS232 (Serielle Schnittstelle) unterstützt, wollte ich einmal ein kleines Programm am PC schreiben, dass bestimmte Signale (z.B. Tastatureingaben vom PC) an die Serielle Schnittstelle schickt. Treiber werden wunderbar erkannt, ich hatte auch schon möglichkeiten, via cutecom (gui für minicom), mit dem PIC zu "kommunizieren". Nur würde ich gerne mein eigenes Programm schreiben, dass Befehle senden und empfangen kann.
Kennt sich jemand mit dieser Hardware gut aus?
Ich würde mich sehr um Beispielcode oder Links mit Beschreibungen freuen, die bei euch schon mal zum Erfolg geführt haben.
lg
vali
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Bitteschön: http://netzmafia.de/skripten/hardware/index.html
Beitrag zuletzt geändert: 14.3.2009 16:24:55 von kochmarkus -
oder hier das ganze zum offline schmökern
http://www.amazon.de/Hardware-Hackz-Messen-Steuern-Sensorik/dp/3446407839
plate ist einfach nur der godfather of hardware hackz -
fatfox schrieb:
[...]
plate ist einfach nur der godfather of hardware hackz
Kennst du ihn? Ich hatte das Glück zwei Vorlesungen bei ihm zu besuchen. -
leider nur durch das buch, wurde mal im linux user vorgestellt ich habs gekauft und bin voll begeistert.
bin voll neidisch das du den kennst... -
mhm, danke schon mal für die Links.
Aber irgendwie blicke ich da nicht so ganz durch...
gibts da keine einfache Lösung, so wie z.B.:
#include <stdio.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <termios.h> #include <unistd.h> int fd1; int fd2; char *buff,*buffer,*bufptr; int wr,rd,nbytes,tries; int main() { fd1=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); fcntl(fd1, F_SETFL,0); printf("Port 1 has been sucessfully opened and %d is the file description\n",fd1); wr=write(fd1,"txt\r",4); rd=read(fd1,buff,100); printf("Bytes sent are %d \n",rd); close(fd1); }
Diesen code habe ich auf der Website http://softexpert.wordpress.com/2007/10/18/how-to-connect-to-a-serial-port-in-linux-using-c/ gefunden, jedoch immer diese Fehlermeldungen:
Port 1 has been sucessfully opened and 3 is the file description Bytes sent are -1
-
So ein ähnliches Skript steht auch in meinem Link: http://netzmafia.de/skripten/hardware/rp1/rp11.html im Abschnitt Programmierung mit C.
Bist du sicher, dass es /dev/ttyUSB0 ist (also ein USB <-> RS232 Adapter) und nicht /dev/ttyS0?
Wenn ja, stimmen dann die Rechte? (Also darsft du als Benutzer nach /dev/ttyUSB0 schreiben bzw. lesen, oder führst du das Programm eeh als root aus?)
Dein Buffer ist nur ein Pointer, du müsstest mit malloc() speicher allozieren, oder gleich ein statischen Buffer nehmen. Ausserdem hast du da ziemlich viel Variablen die du gar nicht verwendest.
Du könntest zusätzlich zu rd auch mal wr ausgeben. Und in der vorletzten Zeile würde ein "Bytes received ..." mehr Sinn machen.
Und dann vllt. auch noch die Fehler ausgeben lassen:
[...] char buff[100]; [...] wr = write(fd1, "txt\r", 4); if(wr != 4) printf("Error sending data: %s\n", strerror(errno)); rd = read(fd1, buff, 100); if(rd < 0) printf("Error receiving data: %s\n", strerror(errno)); printf("Bytes sent are %d\n",wr); printf("Bytes received are %d\n", rd); close(fd1); ...
-
Danke kochmarkus, dein Programm funktioniert super!
Als Ausgabe erhalte ich folgenden Text:
Bytes sent are 4 Bytes received are 15
Das müsste auch eigentlich stimmen, da der PIC die Daten "txt\r" geschickt bekommt und selbst die Daten "Wie heisst du?\r" schreibt.
Nur noch zwei Fragen:
[...] rd = read(fd1, buff, 100); if(rd < 0) printf("Error receiving data: %s\n", strerror(errno)); printf("Bytes received are %s\n", buff); wr = write(fd1, "martin\n\r", 6); if(wr != 6) printf("Error sending data: %s\n", strerror(errno)); printf("Bytes sent are %d\n",wr); rd = read(fd1, buff, 100); if(rd < 0) printf("Error receiving data: %s\n", strerror(errno)); printf("Bytes received are %s\n", buff); [...]
1. kann ich auch beim 2.Mal einlesen die selbe Buffer-Variable hernehmen, weil momentan funkioniert das nicht so ganz?
2. wenn ich eine andere Buffer-Variable benutze (char buff1[100];), dann bekomme ich komischerweise bei diesem Code nichts mehr zurück bzw. nur 1 Byte. Der PIC würde mir aber (getestet mir vielen fertigen Terminals) diesen Text zurückschicken: "Hallo martin\r". Könnte das sein, dass da noch irgendwo was nicht stimmt beim Schreiben?
Beitrag zuletzt geändert: 15.3.2009 11:53:58 von valuser -
Ersetzte
mal durchwr = write(fd1, "martin\n\r", 6);
wr = write(fd1, "martin\r", 7);
Die Zeile danach natürlich auch anpassen.
€dit: Zweimal den gleichen Buffer verwenden ist natürlich kein Problem.
Beitrag zuletzt geändert: 15.3.2009 12:03:00 von kochmarkus -
Mhm, das bring auch nicht wirklich etwas...
Rückmeldung:
Bytes(15) received are [Wie heisst du? ] Bytes sent are 7 Bytes(1) received are [ ]
Mein Code:
rd = read(fd1, buff, 100); if(rd < 0) printf("Error receiving data: %s\n", strerror(errno)); printf("Bytes(%d) received are [%s]\n", rd, buff); wr = write(fd1, "martin\r", 7); if(wr != 7) printf("Error sending data: %s\n", strerror(errno)); printf("Bytes sent are %d\n",wr); rd = read(fd1, buff1, 100); if(rd < 0) printf("Error receiving data: %s\n", strerror(errno)); printf("Bytes(%d) received are [%s]\n", rd, buff1);
und weißt du auch vl. wie ich ganz leicht die Variable buff[100] wieder "löschen" kann, d.h. dass ich sie mit neuem (und vl. kürzerem) Inhalt beschreiben kann? -
buff musst du nicht ganz löschen sonder nur ein "\0" an das Ende des gelesenen Strings anhängen:
rd = read(fd1, buff, 100); buff[rd+1] = '\0';
Und ist bei deinem Beispiel die Variable buff1 auch ein char Array, also: char buff1[100], oder ein char Pointer? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage