我使用qt制作一个串口通讯的库,发现通过库调用readall读取函数都不到任何数据,打开串口和发送数据都是正常的,这是怎么回事啊

三只猴子 2018-05-21 04:46:46
我试过直接在主函数中调用串口发送和串口读取,也就是open函数和readall函数,能够正常读取到数据。但是我将函数readall的调用写在自己制作的库中,然后用主函数调用这个库,发现readall函数读取到的数据一直为空,打开串口和发送数据的函数可以正常使用,并且外接设备也有相应,这是为什么啊,求告知
...全文
2111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
9527----到 2018-09-26
  • 打赏
  • 举报
回复
博主,我也遇到你这个问题了,串口能打开,下发数据,但是收不到。用的是Ubuntu系统,是今天突然不能用的,前边可以正常收发,代码没改动。而且同样的代码在windows下可以跑,收发没问题。望博主指点一二,不胜感激。
走好每一步 2018-05-25
  • 打赏
  • 举报
回复
引用 4 楼 u014729550 的回复:
[quote=引用 3 楼 tajon1226 的回复:] 建议下载QT source源码,看下里面的Demo。 ReadAll不是用定时器的方式去读的,串口有数据过来,会有一个信号激发的。
找到问题了,需要改成这种形式 QByteArray requestData; requestData = ""; while(this->media.my_serialport->waitForReadyRead(10)) { requestData += this->media.my_serialport->readAll(); //my_serialport是在库中实例化的对象,media是库的实例化,通过库调用库中的串口程序 } 添加waitForReadyRead的判断,就可以读到了,不过读到的格式有问题的话会打印不出来,需要转换格式打印[/quote] 嗯,恭喜你解决问题了,不过建议还是最好看下QT的Demo,里面同步和异步读的demo都有的,只要你安装QT Creator选择安装源码就可以了。
#include <QtSerialPort/QSerialPort>

#include <QTextStream>
#include <QCoreApplication>
#include <QStringList>

QT_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QCoreApplication coreApplication(argc, argv);
    int argumentCount = QCoreApplication::arguments().size();
    QStringList argumentList = QCoreApplication::arguments();

    QTextStream standardOutput(stdout);

    if (argumentCount == 1) {
        standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl;
        return 1;
    }

    QSerialPort serialPort;
    QString serialPortName = argumentList.at(1);
    serialPort.setPortName(serialPortName);

    int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600;
    serialPort.setBaudRate(serialPortBaudRate);

    if (!serialPort.open(QIODevice::ReadOnly)) {
        standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.error()) << endl;
        return 1;
    }

    QByteArray readData = serialPort.readAll();
    while (serialPort.waitForReadyRead(5000))
        readData.append(serialPort.readAll());

    if (serialPort.error() == QSerialPort::ReadError) {
        standardOutput << QObject::tr("Failed to read from port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    } else if (serialPort.error() == QSerialPort::TimeoutError && readData.isEmpty()) {
        standardOutput << QObject::tr("No data was currently available for reading from port %1").arg(serialPortName) << endl;
        return 0;
    }

    standardOutput << QObject::tr("Data successfully received from port %1").arg(serialPortName) << endl;
    standardOutput << readData << endl;

    return 0;
}
三只猴子 2018-05-24
  • 打赏
  • 举报
回复
引用 3 楼 tajon1226 的回复:
建议下载QT source源码,看下里面的Demo。 ReadAll不是用定时器的方式去读的,串口有数据过来,会有一个信号激发的。
找到问题了,需要改成这种形式 QByteArray requestData; requestData = ""; while(this->media.my_serialport->waitForReadyRead(10)) { requestData += this->media.my_serialport->readAll(); //my_serialport是在库中实例化的对象,media是库的实例化,通过库调用库中的串口程序 } 添加waitForReadyRead的判断,就可以读到了,不过读到的格式有问题的话会打印不出来,需要转换格式打印
走好每一步 2018-05-23
  • 打赏
  • 举报
回复
建议下载QT source源码,看下里面的Demo。 ReadAll不是用定时器的方式去读的,串口有数据过来,会有一个信号激发的。
赵4老师 2018-05-22
  • 打赏
  • 举报
回复
百度搜相关关键字。
三只猴子 2018-05-21
  • 打赏
  • 举报
回复
这是我在库中定义的串口函数: //读取接收到的数据 void MediaPort::ReadData() { QByteArray buf; buf = my_serialport->readAll(); if(!buf.isEmpty()) { qDebug()<<"It is not empty!\n"; } buf.clear(); } //打开串口 void MediaPort::OpenPort() { my_serialport->setPortName("com3"); bool ret=my_serialport->open(QIODevice::ReadWrite); qDebug()<<"Port Status:"<<ret; } //发送报文 void MediaPort::SendMessage(string cmd) { SaveData(); string s=hex2string(cmd); int ret=my_serialport->write((const char*)s.c_str(),s.size()); qDebug()<<"writeStatus"<<ret; } 串口的打开和数据发送通过界面按钮控制,数据的接收通过计时器QTimer定时调用readall完成,以下是我在主函数中调用库函数的方法 timer=new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(readslot())); timer->start(1000); serialport= new QSerialPort(); readslot槽函数中调用了串口的接收数据函数ReadData,但是读取不到任何数据,这是为什么啊,难道串口函数不能在库中调用吗

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧