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
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez juste besoin d'utiliser
while( serial_port.rdbuf()->in_avail() > 0 )
comme une condition de la boucle while. Puis il va lire toutes les données disponibles (“réponse”), et vous pouvez envoyer la deuxième commande après que.Eh bien, quel personnage avez-vous d'obtenir au bout de tous les octets de la réponse réelle sont lus? Vous pouvez le vérifier sur ce personnage (je pense qu'il devrait être '\0' ou '\n') et ne
break
sorti de la boucle après que vous l'obtenez.OriginalL'auteur Michael Pankov
Avec try et catch serait utile. 🙂
Essayez ceci:
Un pointeur global SerialPort *qté était déjà déclaré et le port a été ouvert.
De référence:
http://libserial.sourceforge.net/doxygen/class_serial_port.html#a15
OriginalL'auteur Bazooka