我在Ubuntu上使用LibSerial在串行端口上读写数据。
目前,我可以通过串行端口写入和接收字符串,但是我的代码不能很好地工作:特别是, 我想控制读取功能,以便仅在有需要读取的内容时才能读取当没有信息可读取时退出,以发送另一个命令 而不会阻塞流程。
我想要做:
现在,我可以在while循环中使用读取功能发送第一个命令并读取答案,但是我无能为力。 我无法发送第二条命令,因为while循环永不退出,因此程序继续读取。
你能帮我吗?
这是我正在使用的代码:(读和写功能在代码的结尾)
#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 ; }
我认为您只需要使用while( serial_port.rdbuf()->in_avail() > 0 )上一个while循环的条件即可。然后它将读出所有可用数据(“答案”),然后您可以发送第二条命令。
while( serial_port.rdbuf()->in_avail() > 0 )