我在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循环的条件即可。然后它将读出所有可用数据(“答案”),然后您可以发送第二条命令。
问题内容: 我正在尝试 使用FTDI通过USB端口发送/接收数据 ,因此我需要使用C / C ++处理串行通信。我正在使用 Linux (Ubuntu)。 基本上,我已连接到正在侦听传入命令的设备。我需要发送这些命令并阅读设备的响应。命令和响应都是 ASCII字符 。 使用GtkTerm一切正常,但是,当我切换到C编程时,遇到了问题。 这是我的代码: 发生的结果是返回0(根本不读取任何字节)或阻塞
问题内容: 我对读取和写入串行端口有些困惑。我在Linux中有一个使用FTDI USB串行设备转换器驱动程序的USB设备。当我插入它时,它将创建:/ dev / ttyUSB1。 我认为用C打开和读取它很简单。我知道波特率和奇偶校验信息,但是似乎没有标准吗? 我是否缺少某些东西,或者有人可以指出正确的方向? 问题答案: 您必须调用一个从获得。你不能零了,配置它,然后将用。如果使用归零方法,则会遇到
我读了很多问题和答案,但没有找到任何解决方案。也许我的问题不对,但我需要一些指导。我在Linux中使用串行端口,从我的Arduino设备读取数据。每当我想从Arduino向Linux发送数据时,我首先发送两个字节,这表示将从Arduino发送的总字节数。我将这两个字节转换为整数值,并开始从串行端口读取数据。比如说,我想把300字节从Ardiuno发送到Linux,我只需要先写{1,44},然后用下
问题内容: 我最近安装了Ubuntu 11.10,并安装了CodeBlocks IDE,并且我知道默认情况下我具有gcc和std库。 我的问题是: 您对在Ubuntu上使用新的C ++程序员有什么建议吗? 我应该从一开始就获得任何库? 我缺少一个非常好的IDE?(YMMV,但我更喜欢在IDE中工作) 从一开始我就应该意识到任何编程上的陷阱或陷阱吗? 问题答案: 在Ubuntu上,无需IDE即可使用
我正在尝试使用shell和java的组合来读取和写入串行端口。目标是能够使用PrintWriter和BufferedReader从连接到串行端口的设备发送和接收命令。我知道这可以用不同的方式来实现(不使用shell),但这不是我想要的。我希望能够使用shell和java实现这一点。 这是我的代码: 有了这段代码,我特别尝试从串行端口读取数据。我使用java运行shell命令来访问串行端口,然后读取
我正在编写一个简单的C程序,可以从连接到我的Arduino设备的USB端口读取数据。Arduino以9600的波特率输出4字节的数据块。 我希望从Arduino到我的计算机的输入看起来像这样: 136.134.132.130.129.127.126.124.121.119.117.115.113.111. 然而,我得到了这样的结果: 271.274.281..2.4062.4022.40225.4