基本信息
源码名称:qt 串口调试实例源码
源码大小:0.84M
文件格式:.rar
开发语言:C/C++
更新时间:2019-10-20
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include "serialdemo.h" #include "ui_serialdemo.h" #include <QString> #include <QDebug> #include <QMessageBox> #include <QPainter> unsigned char i =0; //串口打开标志重绘图像变量 SerialDemo::SerialDemo(QWidget *parent) : QMainWindow(parent), ui(new Ui::SerialDemo) { ui->setupUi(this); setWindowTitle("串口调试助手V1.0"); timeTimer = new QTimer(this); connect(timeTimer, SIGNAL(timeout()), this, SLOT(showTimeMessage())); connect(this->ui->pbt_scan, SIGNAL(clicked(bool)), this, SLOT(ScanSerialPort())); connect(this->ui->pbt_open, SIGNAL(clicked(bool)), this, SLOT(OpenSerialPort())); connect(this->ui->pbt_send, SIGNAL(clicked(bool)), this, SLOT(SerialPortSend())); connect(this->ui->pbt_Rclear, SIGNAL(clicked(bool)), this, SLOT(ClearRecieveBox())); connect(this->ui->pbt_Tclear, SIGNAL(clicked(bool)), this, SLOT(ClearSendBox())); timeTimer->start(1000); //设置默认值 this->ui->cb_baud->setCurrentIndex(2); this->ui->cb_datbit->setCurrentIndex(3); this->ui->pbt_send->setEnabled(false); // 控件颜色初始化 this->ui->tex_recieve->setStyleSheet("color:red;background:white;"); this->ui->tex_send->setStyleSheet("color:white;background:black;"); ScanSerialPort(); } SerialDemo::~SerialDemo() { delete ui; } // 显示时间 void SerialDemo::showTimeMessage() { QDateTime currentTime = QDateTime::currentDateTime(); QString time = currentTime.toString("yyyy-MM-dd hh:mm:ss ddd"); this->ui->statusBar->showMessage(time); } //查找可用串口 void SerialDemo::ScanSerialPort() { this->ui->cb_port->clear(); int isHavePort = 0; foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); //判断端口能否打开 if(serial.open(QIODevice::ReadWrite)) { this->ui->cb_port->addItem(serial.portName()); isHavePort ; } if(isHavePort == 0) { QMessageBox::information(NULL, "警告", "没有可用串口"); } } } // 打开串口 void SerialDemo::OpenSerialPort() { if(this->ui->pbt_open->text() == tr("打开串口")) { serial = new QSerialPort; //设置串口名 serial->setPortName(this->ui->cb_port->currentText()); //打开串口 bool isOpenSucc = serial->open(QIODevice::ReadWrite); if(isOpenSucc) { //设置波特率 switch(this->ui->cb_baud->currentIndex()) { case 0: serial->setBaudRate(QSerialPort::Baud2400); break; case 1: serial->setBaudRate(QSerialPort::Baud4800); break; case 2: serial->setBaudRate(QSerialPort::Baud9600); break; case 3: serial->setBaudRate(QSerialPort::Baud19200); break; case 4: serial->setBaudRate(QSerialPort::Baud38400); break; case 5: serial->setBaudRate(QSerialPort::Baud57600); break; case 6: serial->setBaudRate(QSerialPort::Baud115200); break; default: break; } //设置数据位 switch(this->ui->cb_datbit->currentIndex()) { case 0: serial->setDataBits(QSerialPort::Data5); break; case 1: serial->setDataBits(QSerialPort::Data6); break; case 2: serial->setDataBits(QSerialPort::Data7); break; case 3: serial->setDataBits(QSerialPort::Data8); break; default: break; } //设置校验位 switch(this->ui->cb_parity->currentIndex()) { case 0: serial->setParity(QSerialPort::NoParity); break; case 1: serial->setParity(QSerialPort::OddParity); break; case 2: serial->setParity(QSerialPort::EvenParity); break; default: break; } //设置停止位 switch(this->ui->cb_stopbit->currentIndex()) { case 0: serial->setStopBits(QSerialPort::OneStop); break; case 1: serial->setStopBits(QSerialPort::OneAndHalfStop); break; case 2: serial->setStopBits(QSerialPort::TwoStop); break; default: break; } //设置流控制 serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制 //关闭设置菜单使能 this->ui->cb_port->setEnabled(false); this->ui->cb_baud->setEnabled(false); this->ui->cb_datbit->setEnabled(false); this->ui->cb_parity->setEnabled(false); this->ui->cb_stopbit->setEnabled(false); this->ui->pbt_open->setText(tr("关闭串口")); this->ui->pbt_send->setEnabled(true); connect(serial, SIGNAL(readyRead()), this, SLOT(SerialPortRecieve())); i=1; //重绘串口打开标志图像 update(); } else { QMessageBox::information(NULL, "警告", "打开串口失败,串口可能被占用,请扫描可用串口。"); } } else { //关闭串口 serial->clear(); serial->close(); serial->deleteLater(); //恢复设置菜单使能 this->ui->cb_port->setEnabled(true); this->ui->cb_baud->setEnabled(true); this->ui->cb_datbit->setEnabled(true); this->ui->cb_parity->setEditable(true); this->ui->cb_stopbit->setEnabled(true); this->ui->pbt_open->setText(tr("打开串口")); this->ui->pbt_send->setEnabled(false); i = 0; //重绘串口打开标志图像 update(); } } //读取接收到的信息 void SerialDemo::SerialPortRecieve() { QByteArray temp = serial->readAll(); QDataStream out(&temp,QIODevice::ReadWrite); //将字节数组读入 while(!out.atEnd()) { qint8 outChar = 0; out>>outChar; //每字节填充一次,直到结束 //十六进制的转换 QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0')); this->ui->tex_recieve->insertPlainText(str.toUpper());//大写 this->ui->tex_recieve->insertPlainText(" ");//每发送两个字符后添加一个空格 this->ui->tex_recieve->moveCursor(QTextCursor::End); } } //发送数据 void SerialDemo::SerialPortSend() { /* QString str = this->ui->tex_send->toPlainText().toLatin1(); if(!str.isEmpty()) { auto isHexSend = this->ui->rb_Thex->isChecked(); int len = str.length(); if(len%2 == 1) { str = str.insert(len-1,'0'); } QByteArray senddata; if(isHexSend) { senddata = QString2Hex(str); if(serial->write(senddata)<0) { QMessageBox::critical(this, tr("Error"), serial->errorString()); } } else { if(serial->write(this->ui->tex_send->toPlainText().toLocal8Bit())<0) { QMessageBox::critical(this, tr("Error"), serial->errorString()); } } //auto isredisplay = ui->reDisplay->isChecked(); //if(isredisplay) // { // ui->textBrowser->append(str); //} } */ QString str = this->ui->tex_send->toPlainText(); //从tex_send得到字符串 QByteArray senddata; if(this->ui->rb_Thex->isChecked()) { senddata = QString2Hex(str); serial->write(senddata); } } void SerialDemo::ClearRecieveBox() { this->ui->tex_recieve->clear(); } void SerialDemo::ClearSendBox() { this->ui->tex_send->clear(); } void SerialDemo::paintEvent(QPaintEvent *) { QPainter painter(this); if(i ==0) { painter.setPen(QPen(Qt::gray,4));//设置画笔形式 painter.drawEllipse(160,255,20,20);//画圆 } if(i==1) { painter.setBrush(QBrush(Qt::red)); painter.drawEllipse(160,255,20,20);//画圆 } } //将十进制int转换为十六进制字符串 QString SerialDemo::decInt2HexStr(int dec) { //保证数据在两帧范围内 if(dec > 65535) { QMessageBox::information(NULL, "警告", "输入超出规定范围(input < 65535)"); return "0"; } QString hexStr; int temp = dec / 16; int left = dec % 16; if(temp > 0) hexStr = decInt2HexStr(temp); if(left < 10) hexStr = (left '0'); else hexStr = ('A' left - 10); return hexStr; } //将输入格式化,补满四位:0XFFFF QString SerialDemo::formatInput(QString hexStr) { int strlen = hexStr.length(); switch(strlen) { case 0: hexStr = "0000"; break; case 1: hexStr = "000" hexStr; break; case 2: hexStr = "00" hexStr; break; case 3: hexStr = "0" hexStr; break; case 4: hexStr = hexStr; break; default: break; } return hexStr; } //字符串转Hex(QByteArray)类型 QByteArray SerialDemo::QString2Hex(QString hexStr) { QByteArray senddata; int hexdata, lowhexdata; int hexdatalen = 0; int len = hexStr.length(); senddata.resize(len/2); char lstr, hstr; for(int i = 0; i < len; ) { //将第一个不为' '的字符赋给hstr; hstr = hexStr[i].toLatin1(); if(hstr == ' ') { i ; continue; } i ; //当i >= len时,跳出循环 if(i >= len) break; //当i < len时,将下一个字符赋值给lstr; lstr = hexStr[i].toLatin1(); //将hstr和lstr转换为0-15的对应数值 hexdata = ConvertHexChar(hstr); lowhexdata = ConvertHexChar(lstr); // if((hexdata == 16) || (lowhexdata == 16)) break; else hexdata = hexdata * 16 lowhexdata; i ; senddata[hexdatalen] = (char)hexdata; hexdatalen ; } senddata.resize(hexdatalen); return senddata; } //将单个字符串转换为hex //0-F -> 0-15 char SerialDemo::ConvertHexChar(char c) { if((c >= '0') && (c <= '9')) return c - 0x30; else if((c >= 'A') && (c <= 'F')) return c - 'A' 10;//'A' = 65; else if((c >= 'a') && (c <= 'f')) return c - 'a' 10; else return -1; }