用C / C ++和LibSerial在Ubuntu上读写串口

我在Ubuntu上使用LibSerial来读写串口上的数据。

目前,我可以在串口上编写和接收string,但是我的代码不能很好地工作:特别是, 我想控制阅读function,以便只有在阅读时才能阅读并在没有要读取的信息的情况下退出,以发送另一个命令,而不会阻塞stream程程序。

我想要做:

  • 写一个命令
  • 等待答案
  • 然后写另一个命令
  • 等待回答

现在,我可以发送第一个命令,并通过在while循环中使用read函数来读取答案,但是我无法做其他任何事情。 我无法发送第二个命令,因为while循环从不退出,程序继续读取。

你能帮我吗?

这是我正在使用的代码:(读取和写入function是在代码的末尾)

#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 ; } 

Solutions Collecting From Web of "用C / C ++和LibSerial在Ubuntu上读写串口"

我认为你只需要使用while( serial_port.rdbuf()->in_avail() > 0 )作为最后while循环的条件。 然后它会读出所有可用的数据(“答案”),然后你可以发送第二个命令。

使用try和catch会有帮助。 🙂

试试这个:一个全局指针SerialPort * pu已经被声明并且端口被打开了。

 int rxstring(char *cstr, unsigned int len, bool print_str) { char temp=0; int i=0; while(temp!='\n') { try { temp=pu->ReadByte(100); } catch(SerialPort::ReadTimeout &e) { //cout<<"Read Timeout"<<endl; return 1; } if((temp!='\n')&&(temp!=0)&&(temp!=' ')) { cstr[i]=temp; ++i; //cout<<i++<<temp<<'x'<<endl; } } cstr[i]='\0'; if(print_str) puts(cstr); return 0; } 

参考: http : //libserial.sourceforge.net/doxygen/class_serial_port.html#a15