使用 C/C++ 和 LibSerial 在 Ubuntu 中的串行端口上读写 [英] Read and Write on serial port in Ubuntu with C/C++ and LibSerial

查看:103
本文介绍了使用 C/C++ 和 LibSerial 在 Ubuntu 中的串行端口上读写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Ubuntu 上使用 LibSerial 在串口上读写数据.

I'm using LibSerial on Ubuntu to read and write data on serial port.

目前,我可以通过串口写入和接收字符串,但我的代码不能很好地工作:特别是,我想控制读取功能以便只读如果有东西要读取,当没有信息要读取时退出,以便发送另一个命令而不会阻塞流程程序.

At the moment, I'm able to write and receive strings over the serial port, but my code does not work very well: in particular, I'd like to control the reading function in order to read only if there is something to read and exit when there is no information to read in order to send another command without bloicking the flow program.

我想做:

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

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

Now, i'm able to send the first command and read the answer by using read function in a while loop but i'm not able to do nothing else. I'm not able to send the second command because the while loop never exits so the program continues to read.

你能帮我吗?

这是我正在使用的代码:(读写功能在代码末尾)

This is the code i'm using: (Read and write function are at the end of the 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 ;
}

推荐答案

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

I think you just need to use while( serial_port.rdbuf()->in_avail() > 0 ) as a condition for your last while loop. Then it'll read out all the available data ("answer") and you can send the second command after that.

这篇关于使用 C/C++ 和 LibSerial 在 Ubuntu 中的串行端口上读写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆