实例介绍
【实例简介】
【实例截图】
【核心代码】
#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; }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论