#pragma execution_character_set("utf-8")
#include "comui.h"
#include "ui_comui.h"
ComUI::ComUI(QWidget *parent) :
QWidget(parent),
getDataTime(new QTimer(this)),
sendTimer(new QTimer(this)),
fpsTimer(new QTimer(this)),
m_thread(new QThread(this)),
m_recvData(nullptr),
ui(new Ui::ComUI) {
ui->setupUi(this);
// 获取端口号
const auto infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos) {
ui->cBoxCOM->addItem(info.portName());
}
ui->cBoxCOM->setCurrentIndex(ui->cBoxCOM->findText("COM1"));
// 定时发送
connect(sendTimer, &QTimer::timeout, [ = ]() {
on_btn_send_clicked();
});
// 统计帧率
connect(fpsTimer, &QTimer::timeout, [ = ]() {
ui->lab_fps->setText(QString::number(mFps));
mFps = 0;
});
//
// 获取数据
connect(getDataTime, &QTimer::timeout, [ = ]() {
QByteArray str;
if(m_recvData) {
str = m_recvData->GetAsIIData();
if(!str.isEmpty()) {
// 统计帧数
mFps += str.count("\n");
// 显示数据
showData(str);
}
}
});
ui->textEdit->document()->setMaximumBlockCount(100);//设置最多显示100行,到100行之后清空
on_btn_clear_clicked();
}
ComUI::~ComUI() {
// qDebug() << "out ";
if(sendTimer->isActive()) {
sendTimer->stop();
delete sendTimer;
sendTimer = nullptr;
}
if(getDataTime->isActive()) {
getDataTime->stop();
delete getDataTime;
getDataTime = nullptr;
}
if(fpsTimer->isActive()) {
fpsTimer->stop();
delete fpsTimer;
fpsTimer = nullptr;
}
if(m_thread->isRunning()) {
m_thread->deleteLater();
}
delete ui;
}
void ComUI::NewrecvData() {
// qDebug() << "new connect";
// 创建一个新的连接
m_recvData = new RecvThread(ui->cBoxCOM->currentText(), ui->CboxBaudrate->currentText().toInt(), m_COM);
connect(m_recvData, &RecvThread::sigConnectSerial, [ = ](int connect) {
if(connect == 0) {
ui->btn_connect->setText(tr("打开"));
ui->label_error->setText("串口打开失败");
fpsTimer->stop();
getDataTime->stop();
} else if(connect == -1) {
ui->btn_connect->setText(tr("打开"));
ui->label_error->setText("串口被占用");
delete m_recvData;
m_recvData = nullptr;
ui->btn_connect->setChecked(false);
fpsTimer->stop();
getDataTime->stop();
} else if(connect == 1) {
ui->btn_connect->setText(tr("关闭"));
ui->label_error->setText("串口打开成功");
if(!fpsTimer->isActive()) {
fpsTimer->start(1000);
}
if(!getDataTime->isActive()) {
getDataTime->start(100);
}
}
});
// 放入线程中
m_recvData->moveToThread(m_thread);
m_thread->start();
m_recvData->InitSerial();
}
// 连接串口 多线程
void ComUI::on_btn_connect_clicked() {
if(ui->btn_connect->isChecked()) {
if(!m_recvData) {
NewrecvData();
}
} else {
// qDebug() << "DEL ";
getDataTime->stop();
delete m_recvData;
m_recvData = nullptr;
}
}
// 显示ui
void ComUI::showData(QByteArray data) {
if(!ui->cBox_stop->isChecked()) {
// 显示
if(!ui->cBox_recv_hex->isChecked()) {
// asicc全部显示
ui->textEdit->insertPlainText(data);
ui->textEdit->moveCursor(QTextCursor::End);
mRecvData += data.size();
if(b_saveData) {
m_saveData.append(data);
} else {
m_saveData.clear();
}
if(m_saveData.size() > g_saveDataSize) {
WriteFile(QString(m_saveData));
m_saveData.clear();
}
} else {
// qDebug() << "hex";
// hex显示
m_recvHexData.append(data);
if(b_saveData) {
m_saveData.append(data);
} else {
m_saveData.clear();
}
if(m_saveData.size() > g_saveDataSize) {
WriteFile(QString(m_saveData.toHex(' ')));
m_saveData.clear();
}
while(m_recvHexData.size() >= oneFpsNum) {
QByteArray oneData = m_recvHexData.mid(0, oneFpsNum);
m_recvHexData.remove(0, oneFpsNum);
ui->textEdit->append(oneData.toHex(' '));
mRecvData += oneData.size();
mFps++;
}
}
ui->lab_recv->setText(QString("接收字节数:%1").arg(mRecvData));
}
}
void ComUI::on_cBox_recv_hex_clicked(bool checked) {
// 当选择状态发生变化的时候先将缓存中的内容清除
if(m_recvData) {
m_recvData->ClearRecvData();
}
m_recvHexData.clear();
m_saveData.clear();
}
// hex文本每帧多少个数
void ComUI::on_edit_Fps_textChanged(const QString &arg1) {
if(arg1.toInt() > 0) {
oneFpsNum = arg1.toInt();
}
}
// 发送
void ComUI::on_btn_send_clicked() {
// 确定串口对象存在
if(m_recvData) {
if(ui->cBox_send_hex->isChecked()) {
// 发送hex文本
m_recvData->sedHexMsg(ui->textEdit_send->toPlainText());
// 统计发送字符
QByteArray sendData = QByteArray::fromHex(ui->textEdit_send->toPlainText().toUtf8().data());
int num = sendData.size();
mSendData += num;
} else {
// 发送asii文本
m_recvData->sendDataMsg(ui->textEdit_send->toPlainText());
// 统计发送字符
mSendData += ui->textEdit_send->toPlainText().size();
}
ui->lab_send->setText(QString("发送字节数:%1").arg(mSendData));
}
}
// 自动发送定时器
void ComUI::on_checkBox_4_clicked(bool checked) {
if(checked) {
if(ui->edit_send_time->text().toInt() >= 1) {
sendTimer->start(ui->edit_send_time->text().toInt());
}
} else {
if(sendTimer->isActive()) {
sendTimer->stop();
}
}
}
// 修改发送频率
void ComUI::on_edit_send_time_textChanged(const QString &arg1) {
if(arg1.toInt() >= 1 && ui->checkBox_4->isChecked()) {
if(sendTimer->isActive()) {
sendTimer->stop();
}
sendTimer->start(arg1.toInt());
}
}
// 界面清空
void ComUI::on_btn_clear_clicked() {
mSendData = 0;
mRecvData = 0;
ui->lab_send->setText(QString("发送字节数:%1").arg(mSendData));
ui->lab_recv->setText(QString("接收字节数:%1").arg(mRecvData));
}
void ComUI::on_btn_send_clear_clicked() {
ui->textEdit_send->clear();
}
void ComUI::on_btn_recv_clear_clicked() {
ui->textEdit->clear();
}
// 文件保存
void ComUI::WriteFile(QString str) {
if(!m_save_file.open(QIODevice::Append | QIODevice::Text)) {
qDebug() << "文件打开失败";
} else {
QTextStream m_save_out(&m_save_file);
m_save_out << str;
m_save_file.close();
}
}
// 设置保存名称
void ComUI::setComSerial(QString str, int num) {
save_file_name = str + QString("_%1").arg(num);
m_save_file.setFileName(g_settingDir + "/" + save_file_name + ".csv");
}