2010-03-28 5 views
2

Je teste les programmes d'envoi et de réception avec le code commeEffacer les données sur le port série sous Linux en C?

La fonction principale() est inférieure à:

 
#include "lib.h" 

int fd; 

int initport(int fd) { 
    struct termios options; 
    // Get the current options for the port... 
    tcgetattr(fd, &options); 
    // Set the baud rates to 19200... 
    cfsetispeed(&options, B9600); 
    cfsetospeed(&options, B9600); 
    // Enable the receiver and set local mode... 
    options.c_cflag |= (CLOCAL | CREAD); 

    options.c_cflag &= ~PARENB; 
    options.c_cflag &= ~CSTOPB; 
    options.c_cflag &= ~CSIZE; 
    options.c_cflag |= CS8; 

    // Set the new options for the port... 
    tcsetattr(fd, TCSANOW, &options); 
    return 1; 
} 

int main(int argc, char **argv) { 

    fd = open("/dev/pts/2", O_RDWR | O_NOCTTY | O_NDELAY); 
    if (fd == -1) { 
     perror("open_port: Unable to open /dev/pts/1 - "); 
     return 1; 
    } else { 
     fcntl(fd, F_SETFL, 0); 
    } 

    printf("baud=%d\n", getbaud(fd)); 
    initport(fd); 
    printf("baud=%d\n", getbaud(fd)); 

    char sCmd[254]; 
    sCmd[0] = 0x41; 
    sCmd[1] = 0x42; 
    sCmd[2] = 0x43; 
    sCmd[3] = 0x00; 

    if (!writeport(fd, sCmd)) { 
     printf("write failed\n"); 
     close(fd); 
     return 1; 
    } 

    printf("written:%s\n", sCmd); 

    usleep(500000); 
    char sResult[254]; 
    fcntl(fd, F_SETFL, FNDELAY); 

    if (!readport(fd,sResult)) { 
     printf("read failed\n"); 
     close(fd); 
     return 1; 
    } 
    printf("readport=%s\n", sResult); 
    close(fd); 
    return 0; 
} 

 

Le lib.h contient lire et écrire le code au:

Parse and read data frame in C?

et a obtenu le numéro:

afin de tester avec le port série, j'ai utilisé le socat (https://help.ubuntu.com/community/VirtualSerialPort) pour créer une paire de ports série sous Linux et tester mon programme avec ces ports.

La première fois que le programme envoie les données et que le programme reçoit les données est correct. Cependant, si je relis ou même réécris les nouvelles données dans le port série, les données de retour sont toujours nulles jusqu'à ce que j'arrête le port série virtuel et le redémarre, puis les données d'écriture et de lecture sont correctes, mais toujours, seulement une fois.

(Dans le cas réel, la partie envoi se fera par un autre appareil, je prends juste soin des données de lecture du port série. J'ai écrit les deux parties juste pour tester mon code de lecture.)

Quelqu'un a-t-il une idée?

+0

Je vois un bug (peut-être sans rapport avec votre question): Ne pas assigner 'result [iIn-1]' avant de vérifier que 'iIn1> 0' –

+0

Pourriez-vous expliquer pourquoi? et en passant, j'ai écrit iIn <0 pas iIn> 0 – ipkiss

Répondre

1

Soit votre commentaire ou votre code est erroné:

// Set the baud rates to 19200... 
cfsetispeed(&options, B9600); 
cfsetospeed(&options, B9600); 

Ce dit qu'il va mettre la vitesse de transmission à 19200, mais il met vraiment 9600. Peut-être que vous voulez ceci:

// Set the baud rates to 19200... 
cfsetispeed(&options, B19200); 
cfsetospeed(&options, B19200);