Linux steuert mit C Programm über RS232 einen AVR
Hallo Gemeinde,
ich bin dabei ein Programm zu schreiben mit dem ich ein Controller per
RS232 (FT232LR) zu steuern. meine Programm ist schon fast fertig. doch
ich habe eine Problem, denn ich kann leider nicht alle Zeichnen über die
schnittstelle schicken.
Als beispiel, kann ich die folge: 0x0C, 0x00, 0x04 nicht senden. Denn
0x0C ist ein Steuercode (FF) denn ich leider nicht senden kann, was ist
den in meinem Programmcode falsch? Ich möchte alle Bytes von 0x00 bis
0xff senden können, aber wie??
1
2
#include<stdio.h>
3
#include<stdlib.h>
4
#include<sys/ioctl.h>
5
#include<sys/types.h>
6
#include<sys/stat.h>
7
#include<fcntl.h>
8
#include<unistd.h>
9
#include<signal.h>
10
#include<termios.h>
11
#include<string.h>
12
#include<stdbool.h>
13
14
intfd=0;
15
16
intmain(intargc,char**argv)
17
{
18
structtermiosoldtios,options;
19
intcurrstat=0;
20
if((argc<2)||(argc>3))
21
{
22
printf("Fehler: Ungültige Parameter-Anzahl.\n");
23
printf("Aufruf:\n");
24
printf(" %s <device>\n",argv[0]);
25
return1;
26
}
27
28
/* Das Device öffnen */
29
if((fd=open(argv[1],O_RDWR|O_NOCTTY|O_NDELAY))<0)
30
{
31
printf("Fehler: Device \"%s\" kann nicht geöffnet werden.\n",argv[1]);
Du solltest options vor der Verwendung mit Nullen füllen oder nach dem
tcgetattr() mit oldtios vorbelegen.
Vor und nach dem tcsetattr() könntest du mit
system(cmd);
die Einstellungen prüfen, wobei cmd mit
sprintf(cmd,"stty -a < %s",argv[1])
zu belegen ist.
> options.c_cc[VTIME] = 10; /* Timeout 10 Sekunden */
Wert passt nicht zum Kommentar (hat aber nichts mit dem Problem zu tun).
> Du solltest options vor der Verwendung mit Nullen füllen oder nach dem> tcgetattr() mit oldtios vorbelegen.
Damit meinte ich
memset(&options,0,sizeof(options));
oder
options = oldtios;
um sicherzugehen, dass die gesamte Struktur definierte Werte aufweist.
Deswegen: "This structure contains at least the following members:".
ok, habe ich schon geändert, an einem anderen linux pc kommt das als
antwort
-Ausgabe---------------------
0xfffffff9 0x01 0x02 0x04
-----------------------------
doch der controler sendet nur byte weise.
auch es sind auch echte pc keine vm oder so..
>> Du solltest options vor der Verwendung mit Nullen füllen oder nach dem>> tcgetattr() mit oldtios vorbelegen.>> Damit meinte ich> memset(&options,0,sizeof(options));> oder> options = oldtios;> um sicherzugehen, dass die gesamte Struktur definierte Werte aufweist.> Deswegen: "This structure contains at least the following members:".
Ah, da hab ich übersehen, dass du da noch ein tcgetattr(fd, &options)
drin hast. Da ist ja auch OK.
Oliver R. schrieb:> 0xfffffff9 0x01 0x02 0x04> ----------------------------->> doch der controler sendet nur byte weise.
Das ist schon OK. cods ist char, also signed. "0x%02x" gibt zweistellig
aus, wenn es Platz hat. Hat es aber nicht, weil das signed char 0xf9
vorzeichenrichtig auf int erweitert wird. Also entweder cods als
unsigned char deklarieren oder mit
printf("0x%02x ",(unsigned char)cods[i]);
casten.
ja, das ist mir dann ach noch klar geworden, doch ich verstehe jetzt
nicht was ich noch ändern soll, es geht immer noch nicht. mit den doffen
windows programm in excel (ja, ist schon ..) gehts!! aber in liunx
sollte das doch auch gehen.
Gruß Oliver
Hallo,
ja danke, das geht auch, doch ich wollte gerne die Einstelung der
schnittstelle in meinem C code haben. Aber genau das wäre die
Einstellung für die Schnittstelle.
stty -F /dev/ttyUSB0 speed 9600 cs8 -parenb -parodd raw -echo
-parend => kein Paritätsbit
-parodd => Ungrade Paritätsbit
ergo: ttyUSB0 9600 8N1 RAW keine echo ;-)
und das jetzt in C !!! ;-)
das ist noch die Frage, denn mein Programm hängt sich noch auf ;-)
Hat da jemand eine Code?
Gruß
Oliver