• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

ascii string per serielle schnittstelle an ext. gerät senden

wie schon im titel beschrieben, genau das möchte ich tun :?:

ich habe ein gerät welches ich per serieller schnittstelle steuern kann. das teil hat ein eigenes "serielle interface protokoll" mit dem es über eine serielle rs232 verbindung mit der aussenwelt kommuniziert.
ich möchte jetzt quasi das teil mit einem pc bedienen. nun hab ich mich bei windows etwas eingelesen, bei den dokus die ich gefunden habe, bin ich der meinung unter linux muesste es am einfachsten gehen (eventuell befasse ich mich spaeter mit windows)

ok ich müsste per pc einen ascii string über die serielle schnittstelle absenden (2. schritt dann auslesen aber zuerst mal der reihe nach).

gefunden habe ich dazu folgendes:
zuerst muss man wohl den seriellen port öffnen

Listing 1 - Opening a serial port.

#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 */

/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/

int
open_port(void)
{
int fd; /* File descriptor for the port */


fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
/*
* Could not open the port.
*/

perror("open_port: Unable to open /dev/ttyS0 - ");
}
else
fcntl(fd, F_SETFL, 0);

return (fd);
}



dann kann ich daten zum portt schicken:

n = write(fd, "ATZ\r", 4);
if (n < 0)
fputs("write() of 4 bytes failed!\n", stderr);




ich gehe davon aus das "ATZ\r" ein befehl an ein angeschlossenes modem ist. d.h. hier muss mein ascii string rein -> richtig ?


schoen und gut, sollte das nun alles richtig sein, wie kann ich denn den code ausführen ?
code in texteditor rein -> abspeichern
dann muss das doch compiliert werden -> richtig ?
ok an dieser stelle gebe ich öffentlich zu, im studium blau gemacht zu haben
:D

wie kann ich denn den code compilieren damit ich diesen ausführen kann ?
ich brauch erstmal keine graphische gui, ausführen über console reicht vollkommen aus.


ich stell mir das jetzt so vor das ich fuer jeden befehl eine datei erstelle und diese dann einfach per console zünde.

aller anfang ist schwer :wink:

danke fuer eure hilfe !
 

TeXpert

Guru
lies erst mal was, es gibt hier im Forum schon viele Compile-Posts, google bietet Tutorials etc....

wenn Du nicht compilieren willst, dann nimm perl, python oder whatever um die Schnittstelle zu öffnen
 

Efchen

Newbie
fritzbee21 schrieb:
wie kann ich denn den code compilieren damit ich diesen ausführen kann ?
Diesen gar nicht, denn da fehlt ja ein main().
Ansonsten "man cc"
(z.B. cc -O -o programmname source.c)

ich stell mir das jetzt so vor das ich fuer jeden befehl eine datei erstelle und diese dann einfach per console zünde.
Warum so kompliziert? Das ist das erste Mal, dass Du Dich mit Programmierung befasst? Du könntest das alles in einem Programm machen, oder Du triggerst das über Übergabeparameter.

Gruß,
-Efchen
 
OP
F

fritzbee21

Hacker
naja von mir aus könnte es auch so gehen, das man fuer befehl a den buchstaben a eingibt, fuer befehl b buchstaben b usw ...

ich dachte halt ich fang mal einfach an. hie und da hab ich mal was programmiert, im studium hat mich der kram nie sonderlich interessiert (assembler programmierung .... :shock:

lese mich gerade erstmal durch die grundlagen.
man erstellt einen code, diesen compiliert man und dann kann man diesen compilierten code per console ausführen .... richtig ?

klingt nach urschleim .... ich weis :roll:
 

Efchen

Newbie
Für Sprachen wie C ist das richtig, ja. Von wo Du den ausführst, ist dabei egal.
Für Interpretersprachen gilt das nicht, wie TeXpert schon gesagt hat. Die müssen nicht compiliert werden.
 

TeXpert

Guru
ich würde ja bei soviel Unkenntnis (Sprache, Vorgehen und Algorithmus) auf eine interpretierte Sprache setzen und erst mal RAD betreiben. hier z.B. mit python (die Grundlagen hat man in einem Nachmittag drin) dazu dann z.B. http://pyserial.sourceforge.net/ pyserial als Lib und gut ist die Kiste
 
OP
F

fritzbee21

Hacker
ich hab mir mal eben das pyserial angeschaut, mehr als folgendes bräuchte ich garnicht dazu :p

ser
serial.Serial (port='COM1', baudrate=38400, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0)


ser.write("ascii zeichensatz") ->write a string
ser.close() -> close port


pyserial als Lib :?:
na gut ich schau mal weiter
 

TeXpert

Guru
oh mann.... wenn Du pyserial installierst und Deinen python-Scripten nutzt, dann verwendest Du doch schon die Library :( evtl. solltest Du Dein u.u. vorhandenes Diplom zurückgeben...
 
OP
F

fritzbee21

Hacker
nana, das letzte mal das ich irgendwas programmiert hab ist ne ewigkeit her :!:

die pyserial lib hab ich im python drin, laesst sich ja schoen in "modul docs" anzeigen

C:\Python24\lib\site-packages
serial (package)


na wenn das mal kein fortschritt, ist, fuer dich warscheinlich easy, fuer mich ein erfolg

:wink:
 
OP
F

fritzbee21

Hacker
hey :D es funzt
ich kann einen string per com1 an mein gerät schicken und das reagiert dann entsprechend.
ok das ganze ist noch extrem buggi weil ich alles per hand einttippen muss. ausserdem stürzt beim auslesen von 5 bytes

x = ser.read(5)
print x

das python ab. villeicht gibts da ja auch noch ein denkfehler.
aber egal, senden kann ich schonmal meine strings. muss mal sehen das ich das programm irgendwie abspeichern tu, damit ich nicht alles eintippen muss.

:D :D :D
 

TeXpert

Guru
im Prinzip kannst Du alles so wie Du es manuell in den interpreter hackst auch in eine Datei schreiben, die dann mit python foo.py aufrufen

dann würde ich an der Stelle mal eine Pause machen :) und mal heute abend das PythonTutorial lesen... dann kannst Du morgen anfangen richtig zu programmieren...

und auch das Abstürzen bekommt man IDR in den Griff :p evtl. liegen keine 5bytes an...
 
OP
F

fritzbee21

Hacker
funzt wurderbar :D
hab mittlerweile ne for schleife eingebaut und habe die möglichkeit 6 verschiedenen befehle in einer nachfolgenden if schleife auszuführen.

was irgendwie nicht geht, returninfos vom gerät auszulesen.
beispielsweise ein byte auslesen mit
read(1)
bringt keine werte zutage. ich brech den auslesevorgang nach 5 sekunden (timeout) ab, weil sonst die soft sich aufhaengt (wartet auf bytes -> kommt wohl aber nichts)
das geraet sendet aber definitv was zurueck. muss man beim seriellen port etwas beachten, was man beim schreiben nicht tun muss ???
 
Oben