后面又该找工作了,这块的内容也需要好好学习!
QT 篇 QT上位机串口编程-CSDN博客
(1)可以通过安装虚拟串口来模拟串口通信的情况
发现我之前安装过(9.0):
可以生成虚拟串口,无需实际硬件串口就可以实现同一台电脑上串口模拟通信。
(但好像用不了,还是用人家的吧)(7.2)
如何进行虚拟串口测试呢?
串口模拟工具实现测试-CSDN博客
安装了这个软件:
好像是可以了,但我不是很理解。
什么是串口通信呢?
波特率是什么?
数据位,校验位,停止位。
串口通信详解-CSDN博客
串行通信:
同一时刻,只能传输一个bit位的信号,只需要一根信号线。
异步串行通信:发送方和接收方,使用各自的时钟控制数据发送和数据接收。
(为使双方收发协调,要求双方时钟尽可能一致)
串口通信通常是:异步串行通信总线(两条数据线)(全双工)
串口发送一串数据不是连续发送,而是一个字节一个字节发送的。
这是为了防止接收和发送的累计误差。
编程:
QT +=serialport
#include <QSerialPort> //访问串口的库
#include <QSerialPortInfo> //查询串口信息的库
QSerialPort *serialport;
serialport = new QSerialPort(this);
QList<QSerialPortInfo> ports=QSerialPortInfo::availablePorts();
for(int i=0;i<ports.count();i++)
{
QSerialPortInfo info=ports.at(i);
qDebug()<<"串口"<<i+1<<":"<<info.portName();
}
设置串口名称
serialport->setPortName(name);
if (!serialport->open(QIODevice::ReadWrite))
{
qDebug()<<"错误,串口无法打开,可能被占用!";
QMessageBox::about(this,"错误","串口无法打开,可能被占用!");
serialport->close();
return ;
}
设置波特率(通常是115200)
serialport->setBaudRate(baudRate);
设置停止位(高电平)
serialport->setStopBits(QSerialPort::OneStop);
serialport->setStopBits(QSerialPort::TwoStop);
Unknown number of stop bits. This value is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
未知的停止位数。该值被淘汰了。它被提供来维持旧代码工作。强烈建议新代码中别用它了。
设置数据位
serialport->setDataBits(QSerialPort::Data5);
设置奇偶位(校验位)
serialport->setParity(QSerialPort::NoParity);
serialport->setParity(QSerialPort::OddParity);
serialport->setParity(QSerialPort::EvenParity);
数据流量控制(不控制)
serialport->setFlowControl(QSerialPort::NoFlowControl) ;
硬件控制,软件控制
接收数据
connect(serialport,SIGNAL(readyRead()),this,
SLOT(serialPortReadyRead()));
void MainWindow::serialPortReadyRead()
{
QByteArray temp = serialport->readAll();
}
发送数据
QByteArray buff;
//写入数据
serialport->write(buff);
示例:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSerialPort> //访问串口的库
#include <QSerialPortInfo> //查询串口信息的库
#include <QDebug> //用于调试打印输出的库
namespace Ui {
class widget;
}
class widget : public QWidget
{
Q_OBJECT
public:
explicit widget(QWidget *parent = 0);
~widget();
public slots:
void serialPortReadyRead();
private slots:
void on_pushButton_clicked();
private:
Ui::widget *ui;
QSerialPort *serialport;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
widget::widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::widget)
{
ui->setupUi(this);
serialport = new QSerialPort(this);
connect(serialport,SIGNAL(readyRead()),this,
SLOT(serialPortReadyRead()));
QList<QSerialPortInfo> ports=QSerialPortInfo::availablePorts();
for(int i=0;i<ports.count();i++)
{
QSerialPortInfo info=ports.at(i);
qDebug()<<"串口"<<i+1<<":"<<info.portName();
}
QString name="COM2";
serialport->setPortName(name);
if (!serialport->open(QIODevice::ReadWrite))
{
qDebug()<<"错误,串口无法打开,可能被占用!";
QMessageBox::about(this,"错误","串口无法打开,可能被占用!");
serialport->close();
return ;
}
int baudRate=115200;
serialport->setBaudRate(baudRate);
serialport->setStopBits(QSerialPort::OneStop);
serialport->setDataBits(QSerialPort::Data8);
serialport->setParity(QSerialPort::NoParity);
serialport->setFlowControl(QSerialPort::NoFlowControl);
}
widget::~widget()
{
delete ui;
}
void widget::serialPortReadyRead()
{
QByteArray temp = serialport->readAll();
qDebug()<<"recv:"<<temp;
}
void widget::on_pushButton_clicked()
{
QByteArray buff=(ui->lineEdit->text().toLocal8Bit());
//写入数据
serialport->write(buff);
}
效果: