精华内容
下载资源
问答
  • Qt串口文件

    2017-10-24 10:44:32
    Qt平台上实现串口数据的接收发送,在低版本中非常实用
  • Qt5--串口发送文件

    千次阅读 热门讨论 2019-02-16 00:33:05
    创建一个串口工程 定义两个全局变量 QByteArray binByteArray; int dataLen=0; 打开文件 QString initialName; QString fileName = QFileDialog::getOpenFileName(this,tr("choose file"),initialName)...

    创建一个串口工程

    在这里插入图片描述

    定义两个全局变量

    QByteArray binByteArray;
    int        dataLen=0;
    

    打开文件

    QString initialName;
    QString fileName =
            QFileDialog::getOpenFileName(this,tr("choose file"),initialName);  //at the path:initialName ,user choose which file to upload
    fileName = QDir::toNativeSeparators(fileName);
    if(!fileName.isEmpty())
    {
        ui->textEdit->append(fileName);
        QFile file(fileName);
       ui->textEdit->append("\n");
       if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
           qDebug()<<"Can't open the file!"<<endl;
       }
     //  QDataStream in(&file);
    //   datalen = in.readRawData(dataBuf,10);
    //   serial->write(dataBuf,10);
       while(!file.atEnd())
       {
           //QByteArray buf = file.readLine(512);
           binByteArray.append(file.readLine(512));
       }
       dataLen = file.size();
       ui->textEdit->append(QString("%1").arg((dataLen)));
       ui->textEdit->append("\n");
       //ui->textEdit->append(binByteArray.toHex());
    
       file.close();
     }
    

    发送文件

    int length=0;
    length = sizeof(binByteArray)>>10;
    ui->textEdit->append(QString(length));
    
    serial->write(binByteArray);
    //serial->write(InsyncData,sizeof(InsyncData));
    //plainTextEdit->insertPlainText(binByteArray.toHex());
    ui->textEdit->append(tr("\n send OK \n"));
    
    展开全文
  • 俺前两天犯了个错误,怪自己不认真,一个小问题鼓捣一个星期才发现原因所在。网上对这个类型错误描述比较少(PS:可能太low了,大家不屑于描述,见笑...用串口调试助手接收QT发送的数据,发现着实长度对不上呀,而且...

    俺前两天犯了个错误,怪自己不认真,一个小问题鼓捣一个星期才发现原因所在。网上对这个类型错误描述比较少(PS:可能太low了,大家不屑于描述,见笑了哈~),这里记一下,给后来者提个醒,也给自己立个flag。

    1.当时的情况是这样的(问题背景):

    当时用QT的串口类下载文件给嵌入式板子,发出的数据正常,接收到的数据长度不符,一般都是多了;用串口调试助手接收QT发送的数据,发现着实长度对不上呀,而且并不规律。由于是第一次做下载这里,对于编码、对于数据流都不太了解,所以抓紧时间恶补。各种找原因,各种试,各种改编码,没效果哎~一脸懵逼中。。。。

    2.偶然发现多出来的字节(现象锁定):

    多出了啥子呢?我很纳闷。当时数据来源是从二进制文件获取的,读出来,然后转存到QByteArra。为了锁定问题,就减小读取文件长度,找到多出来的字节。嗯,找到了,是“0A”。

        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
        readDataArray = binFile->read(packHead[packLen].value);

    3.进一步探索:

    Windows会在文件末尾加个/r/n,转换成16进制,就是0D 0A,每个0D前面都多了一个0D,好不奇怪呀。二进制文件里面可不管这些有的没的,因为.bin文件里面是数据呀,0D和0A都可能是它本身的数据。再仔细查看,发现单独的0A也会在前面加个0D。这。。。

    4.对比别人家的:

    俺找了个别人家的QT串口调试助手,看了源码,好像很简单呀,可是发送一切正常。于是就开始QT串口配置的一系列信息,查找是否配置原因。后来就发现了这货:

    serialPort->setTextModeEnabled(true);

    这里有个setTextModeEnabled,别人都没有,就俺的有。赶紧去查查干啥的。QT帮助里是这么说的:

    void QIODevice::setTextModeEnabled(bool enabled)
    If enabled is true, this function sets the Text flag on the device; otherwise the Text flag is removed. This feature is useful for classes that provide custom end-of-line handling on a QIODevice.
    The IO device should be opened before calling this function.

    尴尬不?

    5.现象复现,确定原因:

    本来正常的串口代码,发送的是“00 02 0d 0a”,收到的真的多了一个0d。

     00 02 0D 0D 0A[2019-12-30 05:08:34.742]
     00 02 0D 0D 0A[2019-12-30 05:08:34.912]
     00 02 0D 0D 0A[2019-12-30 05:08:35.108]
     00 02 0D 0D 0A[2019-12-30 05:08:35.305]
     00 02 0D 0D 0A[2019-12-30 05:08:35.486]
     00 02 0D 0D 0A[2019-12-30 05:08:35.678]
     00 02 0D 0D 0A[2019-12-30 05:08:35.860]
     00 02 0D 0D 0A[2019-12-30 05:08:36.041]
     00 02 0D 0D 0A[2019-12-30 05:08:36.222]
     00 02 0D 0D 0A[2019-12-30 05:08:36.393]
     00 02 0D 0D 0A[2019-12-30 05:08:36.586]
     00 02 0D 0D 0A[2019-12-30 05:08:36.780]
     00 02 0D 0D 0A[2019-12-30 05:08:36.958]
     00 02 0D 0D 0A[2019-12-30 05:08:37.150]
     00 02 0D 0D 0A[2019-12-30 05:08:37.342]
     00 02 0D 0D 0A[2019-12-30 05:08:37.523]
     00 02 0D 0D 0A[2019-12-30 05:08:37.716]
     00 02 0D 0D 0A[2019-12-30 05:08:37.896]
     00 02 0D 0D 0A[2019-12-30 05:08:38.089]
     00 02 0D 0D 0A[2019-12-30 05:08:38.572]

     

    问题总结:

    setTextModeEnabled(true)意思就是设备以Text模式打开,在读取时,行终止符被转换成\n,所以会导致发送问题。

    展开全文
  • .h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QDebug> #include <QQueue> #include <QTimer> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/...

    .h文件

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QDebug>  
    #include <QQueue>
    #include <QTimer>
    #include <QtSerialPort/QSerialPort>  
    #include <QtSerialPort/QSerialPortInfo>  
    #include "ConfigFileXiaoNiao.h"
    /************************************************************************/
    /* 串口通道,向转发客户端发送                                                                     */
    /************************************************************************/

    class MsgSendBySerialPortPass : public QObject
    {
        Q_OBJECT

    public:
        MsgSendBySerialPortPass(const SERIALPASSLIST&);
        MsgSendBySerialPortPass(QObject * ptr = NULL);
        void initPass();
        static MsgSendBySerialPortPass *GetInstance();
        ~MsgSendBySerialPortPass();
        void setSerialInfo(SERIALPASSLIST);
        void manageRecvMsg(QByteArray msg);//指令处理
        void callBackSendData(QByteArray strData);
        void sendMsgToTarget(QByteArray);//往目标发送指令
        QString getPassID() { return m_passId; }//获取通道ID

    private slots:
        void slotSengDealMsg(QByteArray);//发送处理数据
        void slotRecvData();//接收指令
        void startTimers();
    signals:
        void sigUpdateWidget(QString);
    private:
        QSerialPort *serial;//串口通信
        QString m_passId;//通道ID
        int iBagNum;//包个数
        QQueue<QByteArray> m_MessageQueue;//控制命令消息队列
        QTimer *timer;

    }; 

    #endif // MAINWINDOW_H
     

    .cpp文件

    #include "MsgSendBySerialPortPass.h"
    #include <windows.h>
    MsgSendBySerialPortPass::MsgSendBySerialPortPass(const SERIALPASSLIST& info)
    {
         
    }

    MsgSendBySerialPortPass::MsgSendBySerialPortPass(QObject * ptr /*= NULL*/)
    {

    }
    void MsgSendBySerialPortPass::initPass()
    {
        timer = new QTimer(this);
        timer->setTimerType(Qt::PreciseTimer);
        connect(timer, SIGNAL(timeout()), this, SLOT(startTimers()));
        timer->start(150);
        SERIALPASSLIST serialInfo = ConfigFile::GetInstance()->getSerialPass();//读取串口配置信息
        setSerialInfo(serialInfo);
    }
    MsgSendBySerialPortPass *MsgSendBySerialPortPass::GetInstance()
    {
        static MsgSendBySerialPortPass* pInstance = NULL;
        if (pInstance == NULL)
        {
            pInstance = new MsgSendBySerialPortPass();
        }
        return pInstance;
    }
    MsgSendBySerialPortPass::~MsgSendBySerialPortPass()
    {
        if (serial->isOpen())
        {
            serial->close();
        }
        delete serial;
    }

    void MsgSendBySerialPortPass::setSerialInfo(SERIALPASSLIST info)
    {
        serial = new QSerialPort;
        //设置串口名  
        serial->setPortName(info.passName);
        //打开串口  
        bool bopen = serial->open(QIODevice::ReadWrite);
        if (!bopen)
        {
            //串口打开失败
            return;
        }
        //设置波特率  
        serial->setBaudRate(info.passBaud.toInt());
        //设置数据位数  
        if (info.passData == "5")
        {
            serial->setDataBits(QSerialPort::Data5);
        }
        else if (info.passData == "6")
        {
            serial->setDataBits(QSerialPort::Data6);
        }
        else if (info.passData == "6")
        {
            serial->setDataBits(QSerialPort::Data7);
        }
        else
        {
            serial->setDataBits(QSerialPort::Data8);
        }

        //设置奇偶校验  
        if (info.passParity == "None")
        {
            serial->setParity(QSerialPort::NoParity);
        }
        //设置停止位  
        if (info.passStop == "1")
        {
            serial->setStopBits(QSerialPort::OneStop);
        }
        else if (info.passStop == "2")
        {
            serial->setStopBits(QSerialPort::TwoStop);
        }
        //设置流控制  
        serial->setFlowControl(QSerialPort::NoFlowControl);
        //连接信号槽  
        connect(serial, &QSerialPort::readyRead, this, &MsgSendBySerialPortPass::slotRecvData);
    }

    void MsgSendBySerialPortPass::manageRecvMsg(QByteArray msg)
    {
        if (msg.size() > 4096)
        {
            callBackSendData(msg);
        }
        else
        {
            sendMsgToTarget(msg);
        }
    }
    void MsgSendBySerialPortPass::callBackSendData(QByteArray strData)
    {
        QByteArray msg = strData.left(4096);
        sendMsgToTarget(msg);

        //延时发送,防止丢包
        QByteArray rightdata = strData.remove(0,4096);
        if (rightdata.size() > 4096)
        {
            callBackSendData(rightdata);
        }
        else
        {
            sendMsgToTarget(rightdata);
        }
    }

    void MsgSendBySerialPortPass::sendMsgToTarget(QByteArray array)
    {
        serial->write(array,array.length());
        serial->flush();
    }

    //发送数据  
    void MsgSendBySerialPortPass::slotSengDealMsg(QByteArray array)
    {
        if (m_MessageQueue.size() < 10)
        {
            m_MessageQueue.enqueue(array);
        }
    }
    //读取接收到的数据  
    void MsgSendBySerialPortPass::slotRecvData()
    {
        QByteArray buf;
        buf = serial->readAll();
        if (!buf.isEmpty())
        {
            QString str = QString::fromLocal8Bit(buf);
            sigUpdateWidget(str);
        }
        buf.clear();
    }

    void MsgSendBySerialPortPass::startTimers()
    {
        if (m_MessageQueue.size()>0)
        {
            QByteArray array = m_MessageQueue.dequeue();
            manageRecvMsg(array);
        }
    }
     

    展开全文
  • 功能作为串口助手来说还算完善,五个发送槽,一个接收槽,可以检测可用串口并加上相关标志,串口设置,记数功能,还有菜单栏上的文件操作和一些选择功能。 下面说一说这个项目: 做这个串口助手分为两步,第一步是...
  • Qt利用串口读取bin文件,并采用定时器把bin文件发送出去
  • Qt串口程序

    2015-01-07 15:27:23
    Qt串口程序,用于接收单片机的温度,发送给单片机系统时间。压缩文件里只有Qt的串口程序。
  • 作者:zzssdd2 ...本章功能主要包含两个方面,一是通过串口发送选定的文本文件,二是将接收的数据保存为本地文本文件。最后还有对《QT串口助手(三):数据接收》章节内容进行一个补充扩展。 2.1、文件打开.

    作者:zzssdd2

    E-mail:zzssdd2@foxmail.com

    一、前言

    开发环境:Qt5.12.10 + MinGW

    功能

    • 文件的发送
    • 数据的保存

    知识点

    • QFile类的使用
    • QTimer类的使用
    • 文本的转码与编码识别
    • QPushButtonQProgressBar控件的使用
      在这里插入图片描述

    二、功能实现

    本章功能主要包含两个方面,一是通过串口发送选定的文本文件,二是将接收的数据保存为本地文本文件。最后还有对《QT串口助手(三):数据接收》章节内容进行一个补充扩展。

    2.1、文件打开

    选择文件按钮点击后,触发点击信号对应的槽函数,在槽函数中进行文件的打开与读取:

    /*选择并打开文件*/
    QString curPath = QDir::currentPath();  //系统当前目录
    QString dlgTitle = "打开文件";  //对话框标题
    QString filter = "文本文件(*.txt);;二进制文件(*.bin *.dat);;所有文件(*.*)"; //文件过滤器
    QString filepath = QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    QFileInfo fileinfo(filepath);
    
    if (filepath.isEmpty())
    {
        QMessageBox::warning(this,"警告","文件为空");
        return;
    }
    //文件路径显示到发送框
    ui->Send_TextEdit->clear();
    ui->Send_TextEdit->appendPlainText(filepath);
    
    QFile file(filepath);
    if (!file.exists())
    {
        QMessageBox::warning(this,"警告","文件不存在");
        return;
    }
    if (!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(this,"警告","文件打开失败");
        return;
    }
    

    2.2、编码判断

    因为应用程序默认使用的编码为UTF-8,如果打开GBK格式编码的文件就会乱码,所以需要判断文件的编码,如果不是UTF-8则需要对文件进行编码转换。

    /* 设置应用程序的编码解码器 */
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    
    • [static] QTextCodec *QTextCodec::codecForName(const char *name)

      Searches all installed QTextCodec objects and returns the one which best matches name; the match is case-insensitive. Returns 0 if no codec matching the name name could be found.

    • [static] void QTextCodec::setCodecForLocale(QTextCodec *c)

      Set the codec to c; this will be returned by codecForLocale(). If c is a null pointer, the codec is reset to the default.

      This might be needed for some applications that want to use their own mechanism for setting the locale.

      Warning: This function is not reentrant.

    /* 判断编码 */
    QTextCodec::ConverterState state;
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    FileText = codec->toUnicode(data.constData(),data.size(),&state);
    //若有无效字符则是GBK编码
    if (state.invalidChars > 0) 
    {
        //转码后返回
        FileText = QTextCodec::codecForName("GBK")->toUnicode(data);
    }
    else
    {
        FileText =  data;
    }
    

    对文件进行上述的处理后,如果是GBK编码则也能够正确的读取了。

    • QString QTextCodec::toUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const

      Converts the first size characters from the input from the encoding of this codec to Unicode, and returns the result in a QString.

      The state of the convertor used is updated.

    • QString QTextCodec::toUnicode(const QByteArray &a) const

      Converts a from the encoding of this codec to Unicode, and returns the result in a QString.

    在这里插入图片描述

    2.3、文件读取

    文件打开后,需要对文件类型进行判断,然后进行文件数据的读取:

    /*判断文件类型*/
    int type = 0;
    QMimeDatabase db;
    QMimeType mime = db.mimeTypeForFile(filepath);
    if (mime.name().startsWith("text/")) 
    {
        type = 1;	//文本文件
    } 
    else if (mime.name().startsWith("application/")) 
    {
        type = 2;	//二进制文件
    }
    

    QMimeType QMimeDatabase::mimeTypeForFile(const QString&fileName, QMimeDatabase::MatchMode mode = MatchDefault) const

    Returns a MIME type for the file named fileName using mode.

    This is an overloaded function.

    QMimeType 类描述文件或数据的类型,由 MIME 类型字符串表示,获取到文件类型后接下来就知道应该使用什么方法读取文件内容了。常见文件类型如下:

    描述(startsWith) 类型 示例
    text 普通文本 text/plain, text/html, text/css, text/javascript
    image 图像文件(包含动态gif) image/gif, image/png, image/jpeg, image/bmp, image/webp
    audio 音频文件 audio/wav, audio/mpeg, audio/midi, audio/webm, audio/ogg
    video 视频文件 video/mp4, video/x-flv, video/webm, video/ogg
    application 二进制数据 application/xml, application/pdf
    /*读取文件*/
    switch(type)
    {
        case 1:
        {
            //QIODevice读取普通文本
            QByteArray data = file.readAll();
            file.close();
            if (data.isEmpty())
            {
                QMessageBox::information(this, "提示", "文件内容空");
                return;
            }
            /* 判断编码 */
        }
        break;
        case 2:
        {
            int filelen = fileinfo.size();
            QVector<char> cBuf(filelen);//储存读出数据
            //使用QDataStream读取二进制文件
            QDataStream datain(&file);
            datain.readRawData(&cBuf[0],filelen);
            file.close();
            //char数组转QString
            FileText = QString::fromLocal8Bit(&cBuf[0],filelen);
        }
        break;
    }
    
    • QByteArray QIODevice::readAll()

      Reads all remaining data from the device, and returns it as a byte array.

      This function has no way of reporting errors; returning an empty QByteArray can mean either that no data was currently available for reading, or that an error occurred.

    • int QDataStream::readRawData(char *s, int len)

      Reads at most len bytes from the stream into s and returns the number of bytes read. If an error occurs, this function returns -1.

      The buffer s must be preallocated. The data is not decoded.

    • 关于QVector:QVector类是一个提供动态数组的模板类。QVector是Qt的通用容器类之一,它将其项存储在相邻的内存位置并提供基于索引的快速访问。例如上面代码定义了一个大小为filelen的char类型的数组用来储存读取的二进制数据(相对与普通数组而言,QVector数组项可以动态增加,能够避免访问越界等问题)。

    • QT中使用QTextStream或QIODevice类读写普通文本文件,使用QDataStream类读写二进制文本文件

    最后将读取到的文件大小信息和内容显示到接收框并标记有待发送文件:

    //显示文件大小信息
    QString info = QString("%1%2").arg("文件大小为:").arg(FileText.length());
    ui->Receive_TextEdit->clear();
    ui->Receive_TextEdit->append(info);
    //显示文件内容
    if (ui->HexDisp_checkBox->isChecked()) 
    {
        ui->Receive_TextEdit->setPlainText(FileText.toUtf8().toHex(' ').toUpper());
    } 
    else 
    {
        ui->Receive_TextEdit->setPlainText(FileText);
    }
    //设置显示焦点在最顶部
    ui->Receive_TextEdit->moveCursor(QTextCursor::Start,QTextCursor::MoveAnchor);
    
    /*标记有文件发送*/
    isSendFile = true;
    FrameCount = 0;
    ProgressBarValue = 0;
    

    2.4、文件发送

    此时在标记了有文件发送的情况下,点击发送按钮则是发送文件:

    /*
        函   数:on_Send_Bt_clicked
        描   述:发送按键点击信号槽
        输   入:无
        输   出:无
    */
    void Widget::on_Send_Bt_clicked()
    {
        if (isSerialOpen != false)
        {
            if (isSendFile)	//发送文件数据
            {
                if (ui->Send_Bt->text() == "发送") 
                {
                    ui->Send_Bt->setText("停止");
                    SendFile();
                } 
                else 
                {
                    ui->Send_Bt->setText("发送");
                    FileSendTimer->stop();
                }
            }
            else	//发送发送框数据
            {
                SerialSendData(SendTextEditBa);
            }
        }
        else
        {
            QMessageBox::information(this, "提示", "串口未打开");
        }
    }
    
    /*
        函   数:SendData
        描   述:定时器发送文件
        输   入:无
        输   出:无
    */
    void Widget::SendFile(void)
    {
        /*按设置参数发送*/
        FrameLen = ui->PackLen_lineEdit->text().toInt(); // 帧大小
        FrameGap = ui->GapTim_lineEdit->text().toInt();  // 帧间隔
        int textlen = Widget::FileText.size();           // 文件大小
        if (FrameGap <= 0 || textlen <= FrameLen)
        {
            //时间间隔为0 或 帧大小≥文件大小 则直接一次发送
            serial->write(FileText.toUtf8());
            ui->Send_Bt->setText("发送");
        }
        else
        {
            //按设定时间和长度发送
            FrameNumber = textlen / FrameLen; // 包数量
            LastFrameLen = textlen % FrameLen; // 最后一包数据长度
            //进度条步进值
            if (FrameNumber >= 100) 
            { 
                ProgressBarStep = FrameNumber / 100;
            } 
            else 
            {
                ProgressBarStep = 100 / FrameNumber;
            }
            //设置定时器
            FileSendTimer->start(FrameGap);
        }
    }
    

    设置一个定时器,将文件按照设定的帧大小帧间隔来发送:

    /*文件帧发送定时器信号槽*/
    FileSendTimer = new QTimer(this);
    connect(FileSendTimer,SIGNAL(timeout()),this,SLOT(File_TimerSend()));
    
    /*
        函   数:File_TimerSend
        描   述:发送文件定时器槽函数
        输   入:无
        输   出:无
    */
    void Widget::File_TimerSend(void)
    {
        if (FrameCount < FrameNumber)
        {
            serial->write(FileText.mid(FrameCount * FrameLen, FrameLen).toUtf8());
            FrameCount++;
            //更新进度条
            ui->progressBar->setValue(ProgressBarValue += ProgressBarStep);
        }
        else
        {
            if (LastFrameLen > 0)
            {
                serial->write(FileText.mid(FrameCount * FrameLen, LastFrameLen).toUtf8());
                ui->progressBar->setValue(100);
            }
            /*发送完毕*/
            FileSendTimer->stop();
            FrameCount = 0;
            ProgressBarValue = 0;
            FrameNumber = 0;
            LastFrameLen = 0;
            QMessageBox::information(this, "提示", "发送完成");
            ui->progressBar->setValue(0);
            ui->Send_Bt->setText("发送");
        }
    }
    

    QString QString::mid(int position, int n = -1) const

    Returns a string that contains n characters of this string, starting at the specified position index.

    Returns a null string if the position index exceeds the length of the string. If there are less than n characters available in the string starting at the given position, or if n is -1 (default), the function returns all characters that are available from the specified position.

    Example:

     QString x = "Nine pineapples";
     QString y = x.mid(5, 4);            // y == "pine"
     QString z = x.mid(5);               // z == "pineapples"
    

    2.5、数据保存

    保存数据按钮按下时,将接收框数据按文本方式进行保存:

    /*
        函   数:on_SaveData_Button_clicked
        描   述:保存数据按钮点击槽函数
        输   入:无
        输   出:无
    */
    void Widget::on_SaveData_Button_clicked()
    {
        QString data = ui->Receive_TextEdit->toPlainText();
    
        if (data.isEmpty())
        {
            QMessageBox::information(this, "提示", "数据内容空");
            return;
        }
    
        QString curPath = QDir::currentPath();            //获取系统当前目录
        QString dlgTitle = "保存文件";                     //对话框标题
        QString filter = "文本文件(*.txt);;所有文件(*.*)";  //文件过滤器
        QString filename = QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
        if (filename.isEmpty())
        {
            return;
        }
        QFile file(filename);
        if (!file.open(QIODevice::WriteOnly))
        {
            return;
        }
    
        /*保存文件*/
        QTextStream stream(&file);
        stream << data;
        file.close();
    }
    

    QTextStream::QTextStream(FILE *fileHandle, QIODevice::OpenModeopenMode = QIODevice::ReadWrite)

    Constructs a QTextStream that operates on fileHandle, using openMode to define the open mode. Internally, a QFile is created to handle the FILE pointer.

    This constructor is useful for working directly with the common FILE based input and output streams: stdin, stdout and stderr. Example:

     QString str;
     QTextStream in(stdin);
     in >> str;
    

    三、扩展

    这里对接收模块的功能进行一个补充。上面说了应用程序默认编码是UTF-8,那么如果在ascii显示模式下收到的数据是GBK格式的编码就会造成显示乱码,所以需要对接收数据进行编码判断,如果是GBK编码则进行转换显示。

    /*
        函   数:SerialPortReadyRead_slot
        描   述:readyRead()信号对应的数据接收槽函数
        输   入:无
        输   出:无
    */
    void Widget::SerialPortReadyRead_slot()
    {
        /*读取串口收到的数据*/
        QByteArray bytedata = serial->readAll();
        
        //......省略
        
        if(ui->HexDisp_checkBox->isChecked() == false)  //ascii显示
        {
            /* 判断编码 */
            QTextCodec::ConverterState state;
            //调用utf8转unicode的方式转码,获取转换结果
            QString asciidata = QTextCodec::codecForName("UTF-8")->toUnicode(bytedata.constData(),bytedata.size(),&state);
            //存在无效字符则是GBK,转码后返回
            if (state.invalidChars > 0) 
            {
                asciidata = QTextCodec::codecForName("GBK")->toUnicode(bytedata);
            } 
            else 
            {
                asciidata = QString(bytedata);
            }
            
            //......省略
        }
        
        //......省略
    }
    

    在这里插入图片描述

    四、总结

    本章主要讲解对文件的操作。除了需要了解在QT中对文件类的常用操作之外,个人认为还有比较重要的两个知识点:1是文本编码的判断和转码处理,2是对于二进制文本的读取。

    展开全文
  • Qt串口通信小结

    2020-02-12 00:15:56
    目录 Qt串口通信小结 ...5.串口发送数据 Qt串口详细资料,请参考QSerialport官方文档https://doc.qt.io/qt-5/qserialport.html Qt串口通信小结 1.串口声明与定义 .pro文件中加入: QT += serialpor...
  • Qt 串口小助手

    2014-09-18 22:09:41
    使用第三方qextserialport类写的Qt串口助手,实现了自动搜索串口号;字符串、16进制、10进制三种方式显示接收数据;字符串、16进制发送数据等功能,完全可直接应用于其他软件的开发中 注:需要有安装QT之后直接打开...
  • QT 如何使用QT编写自己的串口调试助手,QT串口使用注意事项QT 串口调试助手1 环境与工具2 设计过程2.1 新建项目与界面布局2.2 程序设计3 注意事项和说明 最近在学习qt,边学编写,写了个串口调试助手,记录过程的同时...
  • 使用串口要注意,再工程文件里添加 QT += serialport 代码我放上来了,编译环境 演示 开了三个线程,一个线程用于串口,一个线程是主窗口,一个线程是保存数据,串口的线程通过信号将数据传递给主程序。 串口: ...
  • GitHub源码:Qt串口调试助手下载 接收字节数计数 (1)在 mainwindow.h文件中创建 收发数属性,再创建两个 标签指针,用于显示收发数目。 (2)mainwindow.c 构造函数中创建两个标签,用于显示收发数量,并...
  • 自己写的第一个qt界面程序,有很多不足。希望能给需要的人一些小思路
  • Qt 串口通讯实例

    2020-07-21 14:59:02
    当我们调试串口程序(读取/发送数据),因串口一般需要连接设备上,调试起来并不方便。这时可以在电脑中创建虚拟COM串口来调试程序,提高效率。 1、写好qt5版串口通讯程序(我使用的是qt5.7.1,项目为:Serial...
  • 本例由《qt开发环境 - 简易二进制文件打开,串口自发自收》更改... 通过串口按固定字节大小发送文件  显示串口收到的内容 下面是源代码: 代码下载地址:http://download.csdn.net/download/zn2857/10194028 /*
  • QT 串口通信助手

    2019-03-27 14:14:56
    简述 最近整理了一下以前写过的代码,把之前的一个上位机程序里的串口功能独立出来,也就相当于一个串口助手。 这个串口助手可以实现串口的波特率、校验位、数据位等的...另外,还可以实现拖动文本文件发送区,...
  • 利用QT 串口通信进行RS232协议开发

    千次阅读 2020-10-23 22:46:48
    QT串口通信协议代码 最近在研究用串口通信去发送协议指令控制相机工作,因为是第一次接触串口,期间也是耗费了点点时间,将自己的部分成果记录下来,以后方便查阅。 在qt下利用Qserialport函数进行的代码编写,一下...
  • QT串口工具First_pro.7z

    2019-12-18 00:47:46
    学习C++时,使用QT编写了一个串口工具,工具参考的其他串口工具,目前已经实现大部分基础功能,还剩下想要增加的功能:文件发送,接收数据文件存储,发送CRC计算,指定接收的第几个字节换成整数,及modbus解析,二级...
  • 准备条件:讯为的4412板子,烧写支持qt文件系统。 思路:新建两个QWidget对象,一个实现串口控制界面,另一个实现串口底层数据收发功能。 一般在做嵌入式的设备开发时,串口的波特率数据位等参数都是固定的,...
  • 本章知识点 1.串口数据接收与发送 2.当打开A按钮B按钮无法...串口函数的使用需在.pro文件内添加QT += core gui serialport 代码示例 .pro #------------------------------------------------- # # Project created...
  • qt 串口收发(完整版)

    万次阅读 多人点赞 2019-03-31 22:44:07
    看过好几篇有关于串口收发的博客,通过学习,写了一个较完整功能的串口,包含16进制的发送、接受和换行插入(有些上位机的奇偶校验和停止位都写死了,实际使用中都需要用到,我加入了选择) 一、新建工程后在...
  • 我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将...首先,一定要在.pro文件中添加:QT += serialport 串口初始化如下: /****************************串口初始化************
  • 效果图 实现流程 1.打开串口设备 open(/dev/xxxx, O_RDWR); ...2.配置串口设备(波特率 、数据位 8b、停止位 1b 和...1、在工程文件中添加串口模块 QT+= serialport #include <QSerialPort> #include ...
  • 第一步先实现QT文件读取功能,设计参数列表读取文件 使用c语言的文件读写,使用格式输入输出,方便存取数据 第二步读取配置文件生成命令列表 读取配置文件内容动态生成命令列表 第一步先实现QT文件读取功能,...
  • 基于QT串口上位机

    2020-05-26 14:10:40
    1、基于QT串口配置;2、串口发送与接收;3、数据处理及显示;4、CRC16数据校验;5、文件的打开与保存;
  • Qt 编写串口通信程序 我们先新建一个QT GUI myCom 在Qt中没有特定的串口控制类,所以我们准备了6个第三方类(链接: https://pan.baidu.com/s/1iRGl7dhQl0mWewCc8-v70w 提取码: xkfg 复制这段内容后打开百度网盘手机...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 131
精华内容 52
关键字:

qt串口发送文件