首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QT串口读取

QT串口读取
EN

Stack Overflow用户
提问于 2017-03-03 10:33:04
回答 1查看 17.3K关注 0票数 4

我正在尝试通过usb读取设备插头发送的数据。首先,我通过以下命令读取数据

  • sudo stty -F /dev/ttyUSB0 0 1200圆括号甚至cs7 -crtscts
  • cat /dev/ttyUSB0 0

数据是这样的

代码语言:javascript
运行
复制
TGPHI_s -0,24 =

MESURES2 BT 4 SUP36 A

PTCOUR2 HPH /

现在我想通过Qt5.3程序读取数据

代码语言:javascript
运行
复制
QSerialPort serial;
serial.setPortName("ttyUSB0");
if(!serial.setBaudRate(QSerialPort::Baud1200 , QSerialPort::Input))
    qDebug() << serial.errorString();
if(!serial.setDataBits(QSerialPort::Data7))
    qDebug() << serial.errorString();
if(!serial.setParity(QSerialPort::EvenParity))
    qDebug() << serial.errorString();
if(!serial.setFlowControl(QSerialPort::HardwareControl))
    qDebug() << serial.errorString();
if(!serial.setStopBits(QSerialPort::OneStop))
    qDebug() << serial.errorString();
if(!serial.open(QIODevice::ReadOnly))
    qDebug() << serial.errorString();
qDebug() << serial.bytesAvailable();
while(true)
{
    if (serial.isOpen()) {
        qDebug() << "Serial port is open...";
        QByteArray datas = serial.readAll();
        if (datas.size() == 0) {
            qDebug() << "Arrived data: 0";
        } else {
            for (int i = 0; i < datas.size(); i++){
                if (datas.at(i)) {
                    qDebug() << datas[i];
                }
            }
        }

    } else {
        qDebug() << "OPEN ERROR: " << serial.errorString();
    }
}
return 0;

答案是->

代码语言:javascript
运行
复制
"/dev/ttyUSB0"
0
Serial port is open...
Arrived data: 0
Serial port is open...
Arrived data: 0

所以我的程序没有数据捕捉..。我的问题是:

  • 我是不是错过了QSerialPort设置中的什么东西?
  • 如果没有,为什么没有通过qDebug()显示数据

编辑

多亏了迈克,我终于能读懂这个usb设备了!这是我的最后代码

代码语言:javascript
运行
复制
    QSerialPort serial;
serial.setPortName("ttyUSB0");
if(!serial.setBaudRate(QSerialPort::Baud1200))
    qDebug() << serial.errorString();
if(!serial.setDataBits(QSerialPort::Data7))
    qDebug() << serial.errorString();
if(!serial.setParity(QSerialPort::EvenParity))
    qDebug() << serial.errorString();
if(!serial.setFlowControl(QSerialPort::HardwareControl))
    qDebug() << serial.errorString();
if(!serial.setStopBits(QSerialPort::OneStop))
    qDebug() << serial.errorString();
if(!serial.open(QIODevice::ReadOnly))
    qDebug() << serial.errorString();
QObject::connect(&serial, &QSerialPort::readyRead, [&]
{
    //this is called when readyRead() is emitted
    //qDebug() << "New data available: " << serial.bytesAvailable();
    qDebug() << "New data available: " << serial.bytesAvailable();
    QByteArray datas = serial.readAll();
    qDebug() << datas;
});
QObject::connect(&serial,
                     static_cast<void(QSerialPort::*)(QSerialPort::SerialPortError)>
                     (&QSerialPort::error),
                     [&](QSerialPort::SerialPortError error)
{
    //this is called when a serial communication error occurs
    qDebug() << "An error occured: " << error;
    return qApp->quit();
});


if(!serial.open(QIODevice::ReadOnly))
    qDebug() << serial.errorString();
return qApp->exec();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-03 11:20:14

Qt中的大多数IO函数都是异步的。这意味着readAll()不会等待数据到达。相反,它返回当前可用的数据(无需等待即可从设备读取的数据)。目前,您只是在一个没完没了的循环中调用readAll (这就使得线程在这个循环中花费了所有的时间,无法接收可能已经到达的新数据。。。)

只有当您知道新的数据已经到达时,才需要调用readAll。这可以通过两种方式实现:

  • 非阻塞异步方式: 当设备中有新的数据可用时,可以使用readyRead()信号来获得通知,而不是永远循环。这就是你应该如何在Qt中做大部分事情,以便能够对随时可能到达的多个事件采取行动。您的代码可以这样重写: #包括int main(int argc,char* argv[]){ QCoreApplication a(argc,argv);QSerialPort串口;serial.setPortName("ttyUSB0");serial.setPortName(“ttyUSB0”);qDebug() << serial.errorString();if(!serial.setDataBits(QSerialPort::Data7 7) qDebug() << serial.errorString();if(!serial.setFlowControl(QSerialPort::HardwareControl)) qDebug() << serial.errorString();if(!serial.setStopBits(QSerialPort::OneStop)) qDebug() << serial.errorString();if(!serial.open(QIODevice::ReadOnly)) qDebug() << serial.errorString();QObject::connect(&serial,&QSerialPort::readyRead,&{/当发出readyRead()时调用qDebug() <<“新数据可用:”<< serial.bytesAvailable();QByteArray datas = serial.readAll();qDebug() << datas;});连接(&串行,static_cast (&QSerialPort:: error ),当串行通信错误发生qDebug() <<时调用& {//)“发生错误:”<<错误;a.quit();});返回a.exec();// ^//非常重要:启动Qt主事件循环//这使得所有异步内容成为可能}
  • 阻塞同步方式: 使用waitForReadyRead()阻塞线程,直到新数据到达串口为止。这使得调用线程在此串口上到达新数据之前无法执行任何操作。如果这个线程是GUI线程,这将使应用程序在这段时间内没有响应。只有当你确信这是你想要的时候,才使用这种方法。您的代码可以这样重写: #包括int main(int argc,char* argv[]){ QCoreApplication a(argc,argv);QSerialPort串口;serial.setPortName("ttyUSB0");serial.setPortName(“ttyUSB0”);qDebug() << serial.errorString();if(!serial.setDataBits(QSerialPort::Data7 7) qDebug() << serial.errorString();if(!serial.setFlowControl(QSerialPort::HardwareControl)) qDebug() << serial.errorString();if(!serial.setStopBits(QSerialPort::OneStop)) qDebug() << serial.errorString();if(!serial.open(QIODevice::ReadOnly)) qDebug() << serial.errorString();qDebug() << serial.bytesAvailable();同时(serial.isOpen()){ if(!serial.waitForReadyRead(-1)) //阻塞,直到新数据到达qDebug() <<“错误:”<< serial.errorString();否则{ qDebug() <<“新数据可用:”<< serial.bytesAvailable();QByteArray datas = serial.readAll();qDebug() << datas;}返回0;}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42576537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档