2017-02-16 7 views
1

Ich habe ein GSM-Modul gekauft und versuche es über eine USB-zu-Seriell-Schnittstelle zu steuern (FT232, um die Komponente zu benennen).Warum erhalte ich kontinuierlich Daten an meiner seriellen Schnittstelle?

Ich habe ein kleines Programm geschrieben, um das FT232 (durch die Verbindung von TX mit RX) vor dem GSM-Modul zu testen, und ich stehe vor einem Problem.

Ich kann Daten senden (normalerweise "AT \ r") und ich kann die gleichen Daten (hoffentlich) aber ich empfange Daten immer wieder (oft '0x0A' und manchmal die ursprünglichen Daten: "AT \ r") ...

Können Sie mir helfen, das zu lösen?


Code of main.c

#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/ioctl.h> 
#include <sys/select.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <termios.h> 
#include <unistd.h> 

int open_serial(); 

int close_serial(int serial_fd); 

int read_serial (int fd); 

int main() 
{ 
    int serial_fd = open_serial(); 

    if (serial_fd == EXIT_FAILURE) 
     return EXIT_FAILURE; 

    struct termios old_termios; 
    struct termios serial_termios; 

    // Port configuration backup 
    tcgetattr(serial_fd, &old_termios); 
    serial_termios = old_termios; 
    // Port setup 
    serial_termios.c_cflag |= (B9600 | CS8 | CLOCAL | CREAD); 
    serial_termios.c_lflag |= (ICANON); 
    // Port configuration update 
    tcsetattr(serial_fd, TCSANOW, &serial_termios); 

    int num_char; 
    char* str2send = "AT\r"; 

    num_char = write(serial_fd, str2send, strlen(str2send)); 
    if (num_char < 0) 
    { 
     fputs("FAIL !\n", stderr); 
    } 
    else 
    { 
     printf("%d char sended\n", num_char); 
    } 

    fd_set serial_in; 
    int count=0;  

    while ((read_serial(serial_fd) > 0) & (count < 25)) 
     count++; 

    // Port configuration restore 
    tcsetattr(serial_fd, TCSANOW, &old_termios); 

    return close_serial(serial_fd); 
} 

int open_serial() 
{ 
    int serial_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); 

    printf("Serial port opening...\n"); 
    if (serial_fd == -1) 
    { 
     printf("FAIL !\n"); 
     perror("open()"); 
     return EXIT_FAILURE; 
    } 
    printf("SUCCESS ! [FD] : [%02d]\n", serial_fd); 

    return serial_fd; 
} 

int close_serial(int serial_fd) 
{ 
    printf("Serial port closing...\n[FD] : [%02d]\n", serial_fd); 
    if (close(serial_fd) == -1) 
    { 
     printf("FAIL !\n"); 
     perror("close()"); 
     return EXIT_FAILURE; 
    } 
    printf("SUCCESS !\n"); 

    return EXIT_SUCCESS; 
} 
int read_serial (int fd) 
{ 
    char rcv_serial [256]; 
    int max_fd = fd + 1; 
    fd_set input; 
    FD_ZERO(&input); 
    FD_SET(fd, &input); 
    int count; 
    // 1sec timeout 
    struct timeval timeout; 
    timeout.tv_sec = 1; 
    timeout.tv_usec = 0; 

    int nb_char, ret_read; 
    int ret_sel = select(max_fd, &input, NULL, NULL, &timeout); 
    if (ret_sel < 0) 
    { 
     perror("select() :"); 
    } 
    else if (ret_sel == 0) 
    { 
     printf("TIMEOUT\n"); 
    } 
    else 
    { 
     if (FD_ISSET(fd, &input)) 
     { 
      nb_char = 10; 
      ioctl(fd, FIONREAD, &nb_char); 
      printf("%d chars availables\n", nb_char); 
      ret_read = read(fd, &rcv_serial, nb_char); 
      printf("[ RET READ : %d]\n", ret_read); 
      rcv_serial[ret_read] ='\0'; 
      for (count = 0; count < ret_read; count++) 
       printf("[%02X]", rcv_serial[count]); 
      printf("\n"); 
      //printf("[%s]\n", rcv_serial); 
     } 
    } 
    return ret_sel; 
} 

Ergebnis

Serial port opening... 
SUCCESS ! [FD] : [03] 
3 char sended 
3 chars availables 
[ RET READ : 3] 
[41][54][0A] 
3 chars availables 
[ RET READ : 3] 
[41][54][0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
3 chars availables 
[ RET READ : 3] 
[41][54][0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
3 chars availables 
[ RET READ : 3] 
[41][54][0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
1 chars availables 
[ RET READ : 1] 
[0A] 
Serial port closing... 
+1

Wenn Sie weiterhin den DR zu lesen, wenn es keine neue Daten ist, wird es weiterhin das gleiche sein. AT-Befehle enden in '" \ r \ n "' und '\ n' darf' '== 0xA', also macht es Sinn. –

+0

Vielen Dank für Ihre Antwort. Es macht Sinn mit diesem Befehl, aber woher weiß ich, ob es eine neue Nachricht oder einen eingehenden Anruf gibt? Sollte ich die serielle Schnittstelle ständig überprüfen? – Teutates

+0

@ Fiddling-Bits, du sagst, dass sich das Register des Chips nicht ändert, wenn keine neuen Daten empfangen werden und so das letzte empfangene Zeichen enthält. Macht viel Sinn. Irgendeine Idee, was ist falsch mit seinem Aufruf von 'read_serial'? Sollte es blockieren oder null zurückgeben, während keine neuen Daten empfangen wurden? –

Antwort

0

Dank Kommentar @sawdust. ich hinzufügen, das ist mein Problem zu lösen Eingang Echo zu deaktivieren:

serial_termios.c_lflag &= ~(ECHO | ECHOE | ECHONL | IEXTEN) 
Verwandte Themen