欢迎来到皮皮网网首页

【php源码扩展】【包头pc源码】【源码资本推荐】qserialport 源码

来源:天劫online源码 时间:2024-11-27 01:06:15

1.用Qt编写一个串口通讯程序
2.读写串口 类QSerialPort
3.Qt中实现串口通信以及完整示例代码
4.QT串口 QSerialPort类的使用

qserialport 源码

用Qt编写一个串口通讯程序

       Qt软件编程,windows下的Qt编程,实现功能串口通信,数据发送和接收。

       根据协议编写打印机串口通信程序。

       新建一个Qt项目: 文件-新建文件或项目(ctrl+n)

       单机 choose 之后

       全部下一步到完成

       成功建立一个Qt Widgets Application

       新建一个管理SerialPort的php源码扩展类  右击项目名字-添加新文件 弹出 如下框:

       选择C++ Class,单机 choose 弹出如下框: 并填写 单机下一步 之后 单机完成

       编写SPComm类: 在SPComm.h中加入头文件 #include QtSerialPort/QtSerialPort

       在头文件中 声明串口功能: bool isOpen() const; void setPortName(const QString name); QString portName() const; void setBaudRate(int baudRate); int baudRate() const; virtual bool open(); virtual void close(); virtual bool clear(); int readData(char *buffer, int count, int timeout = ); int writeData(char *data, int size); int write(char ch); protected: QString m_portName; int m_baudRate; QSerialPort *m_serialPort;

       在CPP文件中实现对应的功能: //这个函数用来设置波特率,打开串口的时候用到 static QSerialPort::BaudRate getBaudRate(int baudRate) { switch (baudRate) { case : return QSerialPort::Baud; case : return QSerialPort::Baud; case : return QSerialPort::Baud; case : return QSerialPort::Baud; case : return QSerialPort::Baud; case : return QSerialPort::Baud; case : return QSerialPort::Baud; case : return QSerialPort::Baud; default: return QSerialPort::UnknownBaud; } } //这个函数用来设置串口的名字 //window 下用"com1"  linux下用"/dev/ttyS0" void SPComm::setPortName(const QString name) { m_portName = name; } //用来获取串口的名字 QString SPComm::portName() const { return m_portName; } //设置波特率 void SPComm::setBaudRate(int baudRate) { m_baudRate = baudRate; } //用来打开串口,调用前,先设置串口名字和波特率 bool SPComm::open() { if (m_serialPort-isOpen()) { return true; } m_serialPort-setPortName(m_portName); m_serialPort-setBaudRate(getBaudRate(m_baudRate)); m_serialPort-setParity(QSerialPort::NoParity); m_serialPort-setDataBits(QSerialPort::Data8); m_serialPort-setStopBits(QSerialPort::OneStop); m_serialPort-setFlowControl(QSerialPort::NoFlowControl); m_serialPort-setReadBufferSize(); return m_serialPort-open(QSerialPort::ReadWrite); }

       //用来关闭串口 void SPComm::close() { if (m_serialPort-isOpen()) { m_serialPort-close(); } }

       //重启串口,清楚数据 bool SPComm::clear() { if (m_serialPort-isOpen()) { m_serialPort-clear(); this-close(); return this-open(); } return false; }

       //用来接收串口发来的数据 int SPComm::readData(char *buffer, int count, int timeout) { int len = 0; forever { int n = m_serialPort-read(buffer[len], count - len); if (n == -1) { return -1; } else if (n == 0 !m_serialPort-waitForReadyRead(timeout)) { return -2; } else { len += n; if (count == len) break; } } return len; }

       //发送数据到串口 比如发送协议 int SPComm::writeData(char *data, int size) { int len = 0; forever { int n = m_serialPort-write(data[len], size - len); if (n == -1) { return -1; } else { len += n; if (size == len) break; } } return len; }

       //别忘记了 //构造函数 添加初始化数据 SPComm::SPComm(QObject *parent) : QObject(parent) { m_serialPort = new QSerialPort(); m_baudRate = ; m_portName = ""; } //析构的时候 删除 数据 SPComm::~SPComm() { delete m_serialPort; }

       串口类编写完成: 测试一下能否调用: 1.双击mainwindow.ui

       切换到了设计模式: 2 拖入按钮

       3 双击按钮,设置按钮的名字

       4设置好按钮的名字为 打开串口 5右击按钮-转到曹-选择clicked()-点击OK 跳转到了 一下界面

       为这个按钮添加功能代码: 首先在mainwindow.h中添加SPComm.h的头文件

       在mainwindow.h头文件中,添加这行代码SPComm *m_spcomm; private: Ui::MainWindow *ui; SPComm *m_spcomm;

       在mainwindow.cpp的构造函数中 添加 m_spcomm = new SPComm(); 析构函数中 添加delete m_spcomm;

       双击mainwindow.cpp 回到按钮那里添加功能 void MainWindow::on_pushButton_clicked() { if(m_spcomm-isOpen()) return; m_spcomm-setBaudRate(); m_spcomm-setPortName("com1"); if(m_spcomm-open()) qDebug() "打开串口成功"; }

       同上关闭串口的代码为 void MainWindow::on_pushButton_2_clicked() { if(m_spcomm-isOpen()) m_spcomm-close(); qDebug() "关闭串口成功"; }

       点击 按钮 编译 并且运行成

       如果想编写一个打印机串口程序 根据以上步骤 同理 添加一个Printer类 根据协议编发送指令,写打印机的功能。 比如发送协议 进行 切纸 换行 打印数据

读写串口 类QSerialPort

       èƒŒæ™¯ï¼šä¸€ä¸ªä¸²å£ä¸‹ä½æœºï¼ˆé»‘盒子)我每次发送数据,黑盒子都会发送回来状态,

        测试情况1

        1、自定义一个类myQSerialPort 继承QSerialPort,槽函数接收回复的状态(发送的信号量为AA,BB) (QSerialPort 改为成员变量依旧有这个问题)

        定义了变量 m__myQSerialPort,有一个写方法 B(B方法组织数据并发送数据)

        m_mutex.lock();//m_mute为QMutex

        发送

        m_mutex.unlock();

        我是在线程  发送完数据,等到接收到 回复的状态在继续执行

        2、一个 线程类 myQThread 发送信号量  A , 然后主线程 发送数据,接收到信号 AA 线程继续运行,

        3、主线程中有一个定时器调用 m__myQSerialPort.B(),

        等到BB信号量  ,

        测试结果发现有时 发送信号量完 A会出现线程不继续执行了, 最后使用串口监控软件,m__myQSerialPort.B()发送的数据和信号量完A发送的 数据被一下 发送给黑盒子了,其不能正常解析,所以就收不到 AA信号量, 线程就 不能执行了, 

        串口例子

        myserial::myserial()

        {

            m_pCurrThread = new QThread;

            m_pSerial = new QSerialPort;

            this->moveToThread(m_pCurrThread);

            m_pSerial->moveToThread(m_pCurrThread);

            connect(m_pCurrThread, &QThread::started, this, &myserial::OpenSerial);

            connect(this, &myserial::SignalWriteData, this, &myserial::WriteData);

            m_pCurrThread->start();

        }

        void myserial::readyRead()

        {

            qDebug()<<"readyRead = "<<QThread::currentThreadId()<<"\n";

            qDebug() << m_pSerial->readAll().length();

        }

        void myserial::OpenSerial()

        {

            qDebug()<<"OpenSerial = "<<QThread::currentThreadId()<<"\n";

            m_pSerial->setPortName(QString("COM4"));

            m_pSerial->setBaudRate( );

            m_pSerial->setDataBits(QSerialPort::Data8);

            m_pSerial->setParity(QSerialPort::NoParity);

            m_pSerial->setStopBits(QSerialPort::OneStop);

            m_pSerial->open(QIODevice::ReadWrite);

            connect(m_pSerial, &QSerialPort::readyRead, this, &myserial::readyRead,Qt::QueuedConnection);

        }

        void myserial::run()

        {

            unsigned char data[6] = { 0X5E,1,1,0,6,0x };

            qDebug()<<"run = "<<QThread::currentThreadId()<<"\n";

            for( int i =0;i< ;i++)

            {

                emit SignalWriteData();

                QThread::sleep(1);

            }

        }

        void myserial::WriteData()

        {

            qDebug()<<"WriteData = "<

            unsigned char data[6] = { 0X5E,1,1,0,6,0x };

            if( m_pSerial->write( (char*)data, 6) < 0 )

                qDebug() <<"write fail";

        }

        //以上办法 是在在 槽函数中打开 串口,在构造函数中mobetothread

        //以下改为在 公有的成员函数中 打开串口 然后moveToThread

        #include "myserial.h"

        #include

        myserial::myserial()

        {

            m_pCurrThread = new QThread;

            m_pSerial = new QSerialPort;

            this->moveToThread(m_pCurrThread);

            //connect(m_pCurrThread, &QThread::started, this, &myserial::OpenSerial);

            connect(this, &myserial::SignalWriteData, this, &myserial::WriteData);

            m_pCurrThread->start();

        }

        void myserial::readyRead()

        {

            qDebug()<<"readyRead = "<<QThread::currentThreadId()<<"\n";

            qDebug() << m_pSerial->readAll().length();

        }

        bool myserial::OpenSerial()

        {

            qDebug()<<"OpenSerial = "<<QThread::currentThreadId()<<"\n";

            m_pSerial->setPortName(QString("COM5"));

            m_pSerial->setBaudRate( );

            m_pSerial->setDataBits(QSerialPort::Data8);

            m_pSerial->setParity(QSerialPort::NoParity);

            m_pSerial->setStopBits(QSerialPort::OneStop);

            bool tf = m_pSerial->open(QIODevice::ReadWrite);

            //m_pSerial->moveToThread(m_pCurrThread);//都可以

            QMetaObject::Connection aa = connect(m_pSerial, &QSerialPort::readyRead, this, &myserial::readyRead,Qt::QueuedConnection);

            m_pSerial->moveToThread(m_pCurrThread);

            return tf;

        }

        void myserial::run()

        {

            unsigned char data[6] = { 0X5E,1,1,0,6,0x };

            qDebug()<<"run = "<<QThread::currentThreadId()<<"\n";

            for( int i =0;i< ;i++)

            {

                emit SignalWriteData();

                QThread::sleep(1);

            }

        }

        void myserial::WriteData()

        {

            qDebug()<<"WriteData = "<<QThread::currentThreadId()<<"\n";

            unsigned char data[6] = { 0X5E,1,1,0,6,0x };

            if( m_pSerial->write( (char*)data, 6) < 0 )

                qDebug() <<"write fail";

        }

Qt中实现串口通信以及完整示例代码

       在Qt开发中,实现串口通信需借助Qt Serial Port模块。以下为实现示例代码。

       首先,调用QSerialPortInfo::availablePorts()函数来遍历并获取可用串口信息。包头pc源码接着,根据需求打开指定串口,设置其基本属性,如波特率、数据位数、校验位等。

       接着,使用QSerialPort::write()函数向串口发送数据,源码资本推荐QSerialPort::readAll()函数则用于接收数据。最后,通过QSerialPort::close()函数关闭串口。

       在使用QSerialPort类前,必须在项目文件中添加QT += serialport这一语句以引入Qt Serial Port模块。

       通过上述步骤,即可在Qt项目中实现串口通信功能。实现过程相对简单,bug的源码关键在于正确设置串口属性和正确使用Qt提供的API。在具体应用中,需根据实际需求调整参数值,以满足不同场景下的通信需求。

QT串口 QSerialPort类的使用

       串口介绍

       串口,即串行通信接口,用于在两个设备之间进行数据传输。衡量通信速度的exe改成源码参数是波特率,代表每秒发送的位数,常见值有、、、等。

       数据位是衡量通信中有效数据位个数的参数,常见设置为5、6、7、8位。

       停止位用于表示单个包的最后一位,常用值为1或2位。

       奇偶校验位在串口通信中用于检错,常见的检错方式有偶校验、奇校验等。

       串口数据流控在QT中提供设置。

       流控制在串行通讯中作用是解决数据丢失问题,当接收端缓冲区已满时停止发送,直到收到继续发送信号再发送数据。流控制分为硬件流控制和软件流控制,硬件流控制包括rts/cts、dtr/cts,软件流控制常用xon/xoff。

       硬件流控制通过rts/cts线实现,rts用于起始调制解调器或数据通讯设备的数据流,cts用于暂停数据流。软件流控制通过xon/xoff字符实现,xoff用于停止数据发送,xon用于开始数据发送。

       初始化串口

       通过QSerialPortInfo类获取串口端口名称和描述。打开串口后,可实现数据接收与发送。接收数据时触发QSerialPort::readyRead事件,发送数据则需编写相应函数。

       以上内容基于博客园(Bruce的笔记本)关于QT串口 QSerialPort类的使用。