#include "serialport.h"
#include "ui_serialport.h"
#include<QSerialPortInfo>
#include<QDebug>
#include<QButtonGroup>
#include<QTextCodec>
#include<QMessageBox>
void SerialPort::serialport_init()
{
foreach(const QSerialPortInfo info,QSerialPortInfo::availablePorts())//可以不使用
{
ui->comboBox_port->addItem(info.portName());
}
}
void SerialPort::show_portStateLabel()
{
QString info=QString("RX^%0 TX^%1 Bytes").arg(rxCount).arg(txCount);
portStateLabel->setText(info);
}
SerialPort::SerialPort(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::SerialPort)
{
ui->setupUi(this);
portStateLabel=new QLabel("RX ---- TX ----");
portStateLabel->setContentsMargins(20,0,20,0);
portStateLabel->setMaximumWidth(1000);
ui->statusBar->addWidget(portStateLabel);
QButtonGroup *btnGroupRev=new QButtonGroup(this);
btnGroupRev->addButton(ui->radio_accept_ascii,0);
btnGroupRev->addButton(ui->radio_accept_hex,1);
ui->radio_accept_hex->setChecked(true);
QButtonGroup *btnGroupSend=new QButtonGroup(this);
btnGroupSend->addButton(ui->radio_send_ascii,0);
btnGroupSend->addButton(ui->radio_send_hex,1);
ui->radio_send_hex->setChecked(true);
timer=new QTimer(this);
timer->stop();
timer->setInterval(ui->spinBox_timer->value());
connect(timer,&QTimer::timeout, this,[=](){
if(serial->isOpen()) on_btnSendData_clicked();});
serial=new QSerialPort(this);
serialport_init();
connect(serial,SIGNAL(readyRead()),this,SLOT(slot_read_from_port()));
}
SerialPort::~SerialPort()
{
delete ui;
}
void SerialPort::closeEvent(QCloseEvent *event)
{
if(serial->isOpen()){
int result;
result=QMessageBox::question(this,"提示","端口已打开,确认退出?",
QMessageBox::Yes|QMessageBox::No);
if(result==QMessageBox::Yes)
{
serial->close();
event->accept();
}else{
event->ignore();
}
}
}
void SerialPort::on_btnReloadPort_clicked()
{
ui->comboBox_port->clear();
serialport_init();
}
void SerialPort::on_btnOpenPort_clicked()
{
serial->setPortName(ui->comboBox_port->currentText());
if (serial->open(QIODevice::ReadWrite))
{
qint32 baudrate=ui->comboBox_baud->currentText().toInt();
serial->setBaudRate(baudrate);
switch(ui->comboBox_databit->currentText().toInt())
{
case 8:
serial->setDataBits(QSerialPort::Data8); break;
case 7:
serial->setDataBits(QSerialPort::Data7); break;
case 6:
serial->setDataBits(QSerialPort::Data6); break;
case 5:
serial->setDataBits(QSerialPort::Data5); break;
default : qDebug()<<"default"<<"databit";
break;
}
switch (ui->comboBox_checkbit->currentIndex()) {
case 0:
serial->setParity(QSerialPort::NoParity); break;
case 1: //odd
serial->setParity(QSerialPort::OddParity); break;
case 2: //even
serial->setParity(QSerialPort::EvenParity); break;
case 3:
serial->setParity(QSerialPort::SpaceParity);break;
case 4:
serial->setParity(QSerialPort::MarkParity); break;
default: qDebug()<<"default"<<"checkbit";
break;
}
switch(ui->comboBox_stopbit->currentText().toInt())
{
case 1:
serial->setStopBits(QSerialPort::OneStop); break;
case 2:
serial->setStopBits(QSerialPort::TwoStop); break;
default: qDebug()<<"default"<<"stopbit";
break;
}
switch(ui->comboBox_flow->currentIndex())
{
case 0:
serial->setFlowControl(QSerialPort::NoFlowControl);break;
case 1:
serial->setFlowControl(QSerialPort::HardwareControl);break;
case 2:
serial->setFlowControl(QSerialPort::SoftwareControl);break;
default: qDebug()<<"default"<<"flow";
break;
}
ui->btnOpenPort->setEnabled(false);
ui->btnClosePort->setEnabled(true);
ui->label_com_baud->setText(QString(" %0 %1").
arg(ui->comboBox_port->currentText()).
arg(ui->comboBox_baud->currentText()));
}
else
{
ui->label_com_baud->setText(QString("Open Failed").
arg(ui->comboBox_port->currentText()));
}
}
void SerialPort::on_btnClosePort_clicked()
{
serial->close();
ui->btnOpenPort->setEnabled(true);
ui->btnClosePort->setEnabled(false);
ui->label_com_baud->setText(" **********");
}
void SerialPort::on_btnResetInfo_clicked()
{
ui->lcdRevNum->display(0);
ui->lcdSendNum->display(0);
}
void SerialPort::on_chk_auto_send_clicked(bool checked)
{
if(checked){
timer->setInterval(ui->spinBox_timer->value());
timer->start();
ui->spinBox_timer->setReadOnly(true);
}
else{
timer->stop();
ui->spinBox_timer->setReadOnly(false);
}
}
void SerialPort::slot_read_from_port()
{
ui->lcdRevNum->display(ui->lcdRevNum->value()+1);
if(ui->chk_showNo->isChecked()){
ui->plainTextEdit_rev->insertPlainText(QString("[%0]^")
.arg(ui->lcdRevNum->value()));
}
QByteArray byteArray = serial->readAll();
rxCount+=byteArray.length(); show_portStateLabel();
QTextCursor cursor = ui->plainTextEdit_rev->textCursor();
cursor.movePosition(QTextCursor::End);
ui->plainTextEdit_rev->setTextCursor(cursor);
if(ui->radio_accept_ascii->isChecked())
{
ui->plainTextEdit_rev->insertPlainText(QString::fromLocal8Bit(byteArray));
}
else if( ui->radio_accept_hex->isChecked())
{
QDataStream out(&byteArray,QIODevice::ReadWrite);
while(!out.atEnd())
{
qint8 outChar = 0;
out>>outChar;
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));
ui->plainTextEdit_rev->insertPlainText(str+" ");
}
//ui->plainTextEdit_rev->appendPlainText(byteArray.toHex()+" ");
}
if(ui->chk_auto_line->isChecked())
{
ui->plainTextEdit_rev->insertPlainText("\n");
}
}
void SerialPort::on_btnSendData_clicked()
{
ui->lcdSendNum->display(ui->lcdSendNum->value()+1);
QString sendstr=ui->plainTextEdit_send->toPlainText();
if(ui->radio_send_ascii->isChecked())
{ //Unicode转GBK 参考博客问答http://bbs.csdn.net/topics/390024555
// QTextCodec *codec = QTextCodec::codecForName("GBK"); //建立一个unicode与GBK之间的转换器
// QByteArray bytes = codec->fromUnicode(sendstr); //unicode转换成gbk
QByteArray bytes=sendstr.toLocal8Bit();//toLatin1
serial->write(bytes);
txCount+=bytes.length();show_portStateLabel();
}
else if(ui->radio_send_hex->isChecked())
{
QByteArray bytes;
bytes = QByteArray::fromHex(sendstr.toLatin1());//toLatin1
serial->write(bytes);
txCount+=bytes.length(); show_portStateLabel();
qDebug()<<bytes.toHex();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SerialPort.zip (35个子文件)
SerialPort
MSVC2015_64
Qt5Widgets.dll 5.27MB
Qt5Gui.dll 5.77MB
SerialPort.exe 116KB
Qt5Core.dll 5.51MB
platforms
qwindows.dll 1.28MB
Qt5SerialPort.dll 72KB
serialport.cpp 7KB
MinGW32
Qt5Svg.dll 350KB
libGLESV2.dll 2.68MB
Qt5Widgets.dll 6.06MB
iconengines
qsvgicon.dll 42KB
libwinpthread-1.dll 78KB
Qt5Gui.dll 5.92MB
SerialPort.exe 109KB
Qt5Core.dll 5.81MB
libgcc_s_dw2-1.dll 118KB
libEGL.dll 22KB
platforms
qwindows.dll 1.68MB
libstdc++-6.dll 1.47MB
imageformats
qtga.dll 26KB
qgif.dll 33KB
qwebp.dll 439KB
qtiff.dll 496KB
qwbmp.dll 25KB
qsvg.dll 27KB
qicns.dll 46KB
qjpeg.dll 242KB
qico.dll 36KB
Qt5SerialPort.dll 76KB
main.ico 11KB
main.cpp 2KB
SerialPort.pro 1KB
serialport.h 887B
serialport.ui 19KB
SerialPort.pro.user 63KB
共 35 条
- 1
资源评论
- lenjohn2020-01-20很贵,但是真的很值得,原来那个少了serialsetting.h,现在这个非常实用,可以直接拿来改成你要的
- android顽童2020-10-27挺好的,多谢分享
lwqsbtl
- 粉丝: 37
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功