我需要一段非常简单的代码来连接一个串行端口(连接一个自制设备的地方),向其中写入一些数据,然后读取回复。写入的数据会点亮设备上的LED(这样可以很容易地看到PC发送的数据是否真的被设备接收到)
我让它与boost/asio一起工作,需要将其移植到QSerialPort。使用QSerialPort,我可以连接、发送数据(我知道它已发送,因为LED亮起),但无法接收任何。。。
以下是boost asio代码:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/serial_port_base.hpp>
#include <boost/thread.hpp>
static std::vector<char> sReceived;
void readThread( boost::asio::serial_port* port )
{
try
{
char read;
while ( boost::asio::read( *port, boost::asio::buffer(&read,1) ) == 1 )
sReceived.push_back( read );
}
catch (...)
{
// connection most likely closed
}
}
int main( int argc, char* argv[] )
{
int res = 1;
if ( argc != 2 )
{
std::cout << "Specify COM port name as first and unic parameter" << std::endl;
}
else
{
try
{
std::string portName = argv[1];
boost::asio::io_service ioservice;
boost::asio::serial_port port( ioservice );
port.open( portName );
port.set_option( boost::asio::serial_port_base::baud_rate( 921600 ) );
port.set_option( boost::asio::serial_port_base::parity( boost::asio::serial_port_base::parity::none ) );
port.set_option( boost::asio::serial_port_base::stop_bits( boost::asio::serial_port_base::stop_bits::one ) );
port.set_option( boost::asio::serial_port_base::character_size( 8 ) );
port.set_option(
boost::asio::serial_port_base::flow_control(
boost::asio::serial_port_base::flow_control::hardware ) );
if ( port.is_open() )
{
boost::thread thrd( readThread, &port );
static const size_t requestMessageSize = 10;
unsigned char request[requestMessageSize] = { 0x01, 0x00, 0x07, 0x01, 0x01, 0x00, 0x00, 0xBE, 0x0B, 0x00 };
if ( boost::asio::write( port,
boost::asio::buffer(request,requestMessageSize) ) == requestMessageSize )
{
boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );
if ( !sReceived.empty() )
{
std::cout << "Received:" << std::hex;
for ( size_t i = 0; i != sReceived.size(); ++i )
{
std::cout << " 0x" << static_cast<int>( sReceived[i] );
}
std::cout << std::endl;
std::cout << "Could open port, send and receive data" << std::endl;
res = 0;
}
else
{
std::cout << "Could open port, send data, but did not received any reply" << std::endl;
}
}
else
{
std::cout << "Could not send data" << std::endl;
}
port.close();
}
else
{
std::cout << "Could not open connection with " << portName << std::endl;
}
}
catch (...)
{
std::cout << "Exception raised by boost asio" << std::endl;
}
}
return res;
}
这是Qt码(不起作用):
#include <QApplication>
#include <QThread>
#include <QMessageBox>
#include <QtSerialPort/QSerialPort>
#include <sstream>
int main( int argc, char* argv[] )
{
QApplication app(argc, argv);
int res = 1;
if ( argc != 2 )
{
QMessageBox::critical( NULL, "Invalid argument", "Specify COM port name as first and unic parameter" );
}
else
{
QString portName = argv[1];
QSerialPort port( portName );
if ( port.open( QSerialPort::ReadWrite ) )
{
if ( port.setBaudRate( 921600 ) &&
port.setFlowControl( QSerialPort::HardwareControl ) &&
port.setStopBits( QSerialPort::OneStop ) &&
port.setParity( QSerialPort::NoParity ) &&
port.setDataBits( QSerialPort::Data8 ) )
{
static const size_t requestMessageSize = 10;
char request[requestMessageSize] = { 0x01, 0x00, 0x07, 0x01, 0x01, 0x00, 0x00, 0xBE, 0x0B, 0x00 };
if ( port.write( request, requestMessageSize ) == requestMessageSize )
{
QThread::sleep( 1 );
QByteArray reply = port.readAll();
if ( !reply.isEmpty() )
{
std::stringstream str;
str << "Received:" << std::hex;
for ( size_t i = 0; i != reply.size(); ++i )
{
str << " 0x" << static_cast<int>( reply.at(i) );
}
str << std::endl;
str << "Could open port, send and receive data" << std::endl;
QMessageBox::information( NULL, "OK", str.str().c_str() );
res = 0;
}
else
{
QMessageBox::critical( NULL, "Error", "Could open port, send data, but did not received any reply" );
}
}
else
{
QMessageBox::critical( NULL, "Error", "Unable to send request to port" );
}
}
else
{
QMessageBox::critical( NULL, "Error", "Unable to configure port" );
}
port.close();
}
else
{
QMessageBox::critical( NULL, "Unable to connect", QString("Could not open connection with %1").arg( portName ) );
}
}
return res;
}
当我运行带有良好端口名称作为参数传递的两个代码时:
我的QSerialPort代码有什么问题?为什么它能够发送数据但无法接收任何数据?
<代码>端口。readAll()在读取某些内容之前不会阻塞,事实上,在返回事件循环或执行waitForReadyRead接收数据和waitforbytesswrited写入缓冲区之前,不会发送或读取任何可用数据。
因此,将线程::sleep(1)替换为端口。WaitForbytesWrited(1000);港口城市waitForReadyRead(1000)
问题内容: 我正在从elasticsearch1.4.3迁移到2.4,并替换了elasticsearch文档中引用的一段代码,而其他参考则需要替换andFilter? 码:- 问题答案: 您可以这样做:
我升级为不和谐。JSV12,但它破坏了我现有的v11代码。下面是一些导致错误的示例: 如何将代码迁移到Discord。JSV12并修复这些错误?在哪里可以看到v12引入的突破性更改?
问题内容: 我正在将Java代码库迁移到纯Scala,并且只能使用这一段代码。我有一个IntervalMap的实现,即一个数据结构,可让您有效地将范围映射到,和操作全部所在的位置(与IntervalTree或SegmentTree略有不同)。 这段代码使用Java,并且在迁移到Scala时遇到了两个大问题: Scala没有-我决定使用(奇怪的Scala有但没有)存储密钥并将值存储在辅助中来解决它。
问题内容: 我正在从弹性搜索1.4.3迁移到2.4,并且替换了弹性搜索文档中引用的一段代码,而其他参考则需要替换andFilter? 码:- 问题答案: 您可以这样做:
Spring云流是否支持下面的Kafka流应用程序。下面是Kafka示例应用程序摘录中的代码。感谢您的任何反馈或支持。
主要内容:升级到 Nexus 2.x 最新版本,升级到 Nexus 3.x 最新版本与 Nexus 2.x 相比,Nexus 3.x 为我们提供了更多实用的新特性,随着 Nexus 3.x 对 Maven 的支持越来稳定,很多公司和组织都陆续将数据从 Nexus 2.x 迁移升级到 Nexus 3.x。 SonaType 官方建议我们,使用最新版本 Nexus 2.x 升级到最新版本 Nexus 3.x,并在 Nexus 升级兼容性 一文中为我们提供了各个版本 Nexus 升级