GNU/Linux >> Tutoriels Linux >  >> Linux

Lecture et écriture sur le port série en C sous Linux

J'ai résolu mes problèmes, donc je poste ici le code correct au cas où quelqu'un aurait besoin de choses similaires.

Ouvrir le port

int USB = open( "/dev/ttyUSB0", O_RDWR| O_NOCTTY );

Définir les paramètres

struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);

/* Error Handling */
if ( tcgetattr ( USB, &tty ) != 0 ) {
   std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl;
}

/* Save old tty parameters */
tty_old = tty;

/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B9600);
cfsetispeed (&tty, (speed_t)B9600);

/* Setting other Port Stuff */
tty.c_cflag     &=  ~PARENB;            // Make 8n1
tty.c_cflag     &=  ~CSTOPB;
tty.c_cflag     &=  ~CSIZE;
tty.c_cflag     |=  CS8;

tty.c_cflag     &=  ~CRTSCTS;           // no flow control
tty.c_cc[VMIN]   =  1;                  // read doesn't block
tty.c_cc[VTIME]  =  5;                  // 0.5 seconds read timeout
tty.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines

/* Make raw */
cfmakeraw(&tty);

/* Flush Port, then applies attributes */
tcflush( USB, TCIFLUSH );
if ( tcsetattr ( USB, TCSANOW, &tty ) != 0) {
   std::cout << "Error " << errno << " from tcsetattr" << std::endl;
}

Écrire

unsigned char cmd[] = "INIT \r";
int n_written = 0,
    spot = 0;

do {
    n_written = write( USB, &cmd[spot], 1 );
    spot += n_written;
} while (cmd[spot-1] != '\r' && n_written > 0);

Il n'était certainement pas nécessaire d'écrire octet par octet, aussi int n_written = write( USB, cmd, sizeof(cmd) -1) a bien fonctionné.

Enfin, lisez :

int n = 0,
    spot = 0;
char buf = '\0';

/* Whole response*/
char response[1024];
memset(response, '\0', sizeof response);

do {
    n = read( USB, &buf, 1 );
    sprintf( &response[spot], "%c", buf );
    spot += n;
} while( buf != '\r' && n > 0);

if (n < 0) {
    std::cout << "Error reading: " << strerror(errno) << std::endl;
}
else if (n == 0) {
    std::cout << "Read nothing!" << std::endl;
}
else {
    std::cout << "Response: " << response << std::endl;
}

Celui-ci a fonctionné pour moi. Merci à tous !


Linux
  1. Linux - Comment basculer entre les sessions Tty et Xorg ?

  2. Linux – Port série Raspberrypi ?

  3. Linux - Différence entre Pts et Tty ?

  4. Linux - Comment trouver des processus utilisant le port série ?

  5. Port série virtuel pour Linux

Comment contrôler les ports périphériques :accéder et écrire sur le port parallèle avec C sous Linux. Première partie

Comment rechercher et fermer des ports ouverts sous Linux

Ouvrir un port sous Linux

Comment et pourquoi utiliser Linux pour installer Telnet

Écouteur et interprète de port série Linux ?

Épuisement des ports réseau Linux