hallo mfro,
ich dachte mir, auch wenn es schon spät ist, schreibe ich mal meine Ergebnisse auf:
Initialisierung der Schnittstelle:
Code: Alles auswählen
/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/
int init_port(void)
{
int fd; /* File descriptor for the port */
struct termios options;
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
fcntl(fd, F_SETFL, 0);
/*
* Get the current options for the port...
*/
tcgetattr(fd, &options);
/*
* Set the baud rates to 19200...
*/
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
// options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
// options.c_lflag |= (ICANON );
options.c_cflag &= ~CRTSCTS;
/* set the options */
tcsetattr(fd, TCSANOW, &options);
//tcsetattr(fd, TCSAFLUSH, &options);
if (fd == -1)
{
/*
* Could not open the port.
*/
perror("open_port: Unable to open /dev/ttyUSB0 - ");
close(fd);
return (-1);
}
else
{
fcntl(fd, F_SETFL, 0);
}
/* FIXME
* Check up connections!!
* and start handy after three times of
* check.
* init modem squence for
* testing the connections
* after these tests we can wait for input
* from modem handy
*/
return (fd);
}
Der Lese Befehl, der Korrektur bedürftig ist!
Code: Alles auswählen
char *lese_befehl ( int fd, char *string, char *string_ret )
{
int i = 0, e = 0, bytes = 0, return_check = 0, res = 0;
//while ( (ioctl(fd, FIONREAD, &bytes)) != 0 ) {} ;
sleep(1);
return_check = ioctl(fd, FIONREAD, &bytes);
if ( return_check != -1 && bytes > 0 )
{
res=read(fd, string, bytes);
string[res]=0;
for(;;)
{
if(string[i] != '\n' )
{
string_ret[e] = string[i];
e++;
}
if(string[i] == '\0')
{
string_ret[e] = '\0';
break;
}
i++;
}
}
return string_ret;
}
hier der Sende Befehl der so aufgebaut ist:
Code: Alles auswählen
int sende_befehl ( int fd, char *string )
{
int n = 0, str_bytes = 0;
str_bytes = (sizeof(string)+2);
n = write(fd, string, str_bytes);
if (n < 0)
{
printf("write(%s) of %i bytes failed!\n",string, str_bytes);
return 1;
}
else
{
return 0;
}
}
Beim "Lese_Befehl" muss ich noch dran, das löschen der CR und LF sollte, denke ich, ausgelagert werden, ich kann solche Dinge auch für andere Funktionen auch nutzen.
Zusätzlich möchte ich gerne, ob das wirklich sinn macht sehe ich dann, dass der Lese_befehl "solange" wartet bis ein Zeichen im Register vorhanden ist, aktuell warte ich 1 Sekunde, das gefällt mir gar nicht, ich warte ja auf die Rückmeldung des Modems.
Ergebnis bei der Ausführung ist aktuell wie folgt:
Befehl: at<cr><lf>................Daten 1: atOK
Befehl: at+cvib=0<cr><lf>...Daten 2: at+cvib=0OK
Befehl: at^scid<cr><lf>........Daten 3: at^scid^SCID: 88773322552211117788OK
Es treten also noch ein paar Unstimmigkeiten auf, der Befehl wird quasi mit als lese_ergebnis übergeben, eventuell könnte man hier den AT-Befehl noch prüfen auf Korrektheit.
Zusätzlich fallen mir noch ein paar Fehler auf, bei gewissen AT Befehle wird dieser nicht komplett übermittelt, wahrscheinlich wegen dem sizeof(xxx) Parameter, dass muss ich mir heute Abend noch einmal anschauen und korrigieren.
Vielen Dank an dich mfro, ich hätte nicht gedacht, so weit zu kommen.
Natürlich auch mein danke an alle die mir Tipps gegeben und mich unterstützt haben.