Lire et Écrire sur le port série dans Ubuntu avec C/C++ et LibSerial

Je suis en utilisant LibSerial sur Ubuntu pour lire et écrire des données sur le port série.

En ce moment, je suis en mesure d'écrire et de recevoir des chaînes de caractères sur le port série, mais mon code ne fonctionne pas très bien: en particulier, j'aimerais contrôle de la fonction de lecture afin de ne lire que si il y a quelque chose à lire et sortir quand il n'y a pas d'informations à lire dans l'ordre d'envoyer une autre commande sans bloicking le flux de programme.

Je veux faire:

  • Écrire une commande
  • Attendre la réponse
  • puis Écrire une autre commande
  • Attendre la réponse

Maintenant, je suis en mesure d'envoyer la première commande et lire la réponse en utilisant la fonction de lecture dans une boucle while mais je ne suis pas en mesure de ne rien faire d'autre.
Je ne suis pas en mesure d'envoyer la deuxième commande car la boucle while jamais quitte donc le programme continue à lire.

Pouvez-vous m'aider, s'il vous plaît?

C'est le code que j'utilise:
(Lire et écrire la fonction sont à la fin du code)

#include <SerialStream.h>
#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <string>
int
main( int    argc,
char** argv  )
{
//
//Open the serial port.
//
using namespace std;
using namespace LibSerial ;
SerialStream serial_port ;
char c;
serial_port.Open( "/dev/ttyACM0" ) ;
if ( ! serial_port.good() )
{
std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
<< "Error: Could not open serial port."
<< std::endl ;
exit(1) ;
}
//
//Set the baud rate of the serial port.
//
serial_port.SetBaudRate( SerialStreamBuf::BAUD_9600 ) ;
if ( ! serial_port.good() )
{
std::cerr << "Error: Could not set the baud rate." <<  
std::endl ;
exit(1) ;
}
//
//Set the number of data bits.
//
serial_port.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ;
if ( ! serial_port.good() )
{
std::cerr << "Error: Could not set the character size." <<  
std::endl ;
exit(1) ;
}
//
//Disable parity.
//
serial_port.SetParity( SerialStreamBuf::PARITY_NONE ) ;
if ( ! serial_port.good() )
{
std::cerr << "Error: Could not disable the parity." <<  
std::endl ;
exit(1) ;
}
//
//Set the number of stop bits.
//
serial_port.SetNumOfStopBits( 1 ) ;
if ( ! serial_port.good() )
{
std::cerr << "Error: Could not set the number of stop bits."
<< std::endl ;
exit(1) ;
}
//
//Turn off hardware flow control.
//
serial_port.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ;
if ( ! serial_port.good() )
{
std::cerr << "Error: Could not use hardware flow control."
<< std::endl ;
exit(1) ;
}
//
//Do not skip whitespace characters while reading from the
//serial port.
//
//serial_port.unsetf( std::ios_base::skipws ) ;
//
//Wait for some data to be available at the serial port.
//
//
//Keep reading data from serial port and print it to the screen.
//
//Wait for some data to be available at the serial port.
//
while( serial_port.rdbuf()->in_avail() == 0 )
{
usleep(100) ;
}
char out_buf[] = "check";
serial_port.write(out_buf, 5);  <-- FIRST COMMAND
while( 1  )
{
char next_byte;
serial_port.get(next_byte);  HERE I RECEIVE THE FIRST ANSWER
std::cerr << next_byte;
}
std::cerr << std::endl ;
return EXIT_SUCCESS ;
}

OriginalL'auteur Marcus Barnet | 2012-01-28