北斗短报文通信通过北斗卡实现短报文的发送,通过串口读取和解析对应的数据。
定位申请 | $DWSQ | 定位信息 | $DWXX |
通信申请 | $TXSQ | 通信信息 | $TXXX |
IC 检测 | $ICJC | IC 信息 | $ICXX |
系统自检 | $XTZJ | 自检信息 | $ZJXX |
时间输出 | $SJSC | 时间信息 | $SJXX |
功率检测 | $GLJC | 功率状况 | $GLZK |
版本读取 | $BBDQ | 版本信息 | $BBXX |
反馈信息 | $FKXX |
具体代码如下:
.h 和串口通信相关
#ifndef BD_SERIALPORTSET_H
#define BD_SERIALPORTSET_H
#include <QWidget>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include "seriport_global.h"
namespace Ui {
class BD_SerialPortSet;
}
class BD_SerialPortSet : public QWidget
{
Q_OBJECT
public:
explicit BD_SerialPortSet(QWidget *parent = 0);
~BD_SerialPortSet();
public:
void checkAvailableSerialPorts(); //检查是否有可用的串口号
void haveAvailablePorts();
void NoAvailablePorts();
void Transmit_PortsSet(); //串口端口参数设置
private slots:
void on_EnsureBtn_clicked();
void on_CancelBtn_clicked();
private:
Ui::BD_SerialPortSet *ui;
};
#endif // BD_SERIALPORTSET_H
/*设置串口,进行串口通信*/
//bd_serialportset.cpp
#include "bd_serialportset.h"
#include "ui_bd_serialportset.h"
BD_SerialPortSet::BD_SerialPortSet(QWidget *parent) :
QWidget(parent),
ui(new Ui::BD_SerialPortSet)
{
ui->setupUi(this);
//this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
// this->setFixedSize(this->size());
this->setWindowIcon(QIcon(":/picture/satellite.png"));
this->setWindowTitle("北斗串口设置");
this->raise();
this->setAttribute(Qt::WA_DeleteOnClose);//退出时自动delete自己
this->setWindowModality(Qt::ApplicationModal);//设置模式,使父窗口不可用
//检测可用的串口号
checkAvailableSerialPorts();
if(ui->COM_CB->count()>0)
{
haveAvailablePorts();
Transmit_PortsSet();
}
else
{
NoAvailablePorts();
}
}
BD_SerialPortSet::~BD_SerialPortSet()
{
delete ui;
}
//检查是否有可用的串口号
/**
* @brief BD_SerialPortSet::checkAvailableSerialPorts
*/
void BD_SerialPortSet::checkAvailableSerialPorts()
{
//ui->COM_CB->addItem("usb_beidou0_link");
//找不到存在串口是不会进入到foreach内部的存在不一定可用
foreach ( const QSerialPortInfo& Info, QSerialPortInfo::availablePorts())
{
QSerialPort availablePort;
availablePort.setPortName(Info.portName());
//检测该串口是否可用
if (availablePort.open(QIODevice::ReadWrite))//protname:/dev/tty0或者/dev/ttyUSB0
{
ui->COM_CB->addItem(Info.portName());
availablePort.close();
}
}
}
void BD_SerialPortSet::haveAvailablePorts()
{
ui->COM_CB->setEnabled(true);
ui->Baud_CB->setEnabled(true);
ui->DataBits_CB->setEnabled(true);
ui->Parity_CB->setEnabled(true);
ui->FlowCtrl_CB->setEnabled(true);
ui->StopBits_CB->setEnabled(true);
}
void BD_SerialPortSet::NoAvailablePorts()
{
ui->Baud_CB->setEnabled(false);
ui->DataBits_CB->setEnabled(false);
ui->Parity_CB->setEnabled(false);
ui->FlowCtrl_CB->setEnabled(false);
ui->StopBits_CB->setEnabled(false);
}
//串口端口参数设置
void BD_SerialPortSet::Transmit_PortsSet()
{
PORTNAME=ui->COM_CB->currentText();
BAUD=ui->Baud_CB->currentText();
DATABITS=ui->DataBits_CB->currentText();
PARITY=ui->Parity_CB->currentText();
FLOWCTRL=ui->FlowCtrl_CB->currentText();
STOPBITS=ui->StopBits_CB->currentText();
}
void BD_SerialPortSet::on_EnsureBtn_clicked()
{
Transmit_PortsSet();
this->close();
}
void BD_SerialPortSet::on_CancelBtn_clicked()
{
this->close();
}
主程序,包含WIFI/4G/RDSS通信
beidou.h
#ifndef BEIDOU_H
#define BEIDOU_H
#include <QMainWindow>
#include <QByteArray>
#include <QElapsedTimer>
#include <QTimer>
#include <QTextStream>
#include <QTcpSocket>
#include <QTcpServer>
#include <QHostAddress>
#include <QProgressDialog>
#include <QUiLoader>
#include <QNetworkConfigurationManager>
#include "bd_serialportset.h"
#include "seriport_global.h"
#define LENGTH 6
namespace Ui {
class BeiDou;
}
class BeiDou : public QMainWindow
{
Q_OBJECT
public:
explicit BeiDou(QWidget *parent = 0);
~BeiDou();
void SerialPortSettings(); //串口参数设置
void readSettingInit(QString fileName);//ini配置文件读取
void append(quint8 type, QString msg); //在文本框中添加数据
QByteArray StrToInterCode(const QString &str);//字符串转内码
QString interCodeToStr(const QByteArray &data);//内码转字符串,要求为双字节数
QByteArray StrToUniCode(QString str);// 字符串转Unicode码
QString UniCodeToStr(QByteArray data);//Unicode码转字符串
/************************解析数据****************************/
QString parse_data(QByteArray data);
QString parse_GPS(QByteArray GPS_data);
QString parse_ICXX(QByteArray ICXX_data);
QString parse_ZJXX(QByteArray ZJXX_data);
QString parse_FKXX(QByteArray FKXX_data);
QString parse_TXXX(QByteArray TXXX_data);
QString parse_DWXX(QByteArray DWXX_data);
QString parse_SJXX(QByteArray SJXX_data);
QString parse_GLXX(QByteArray GLXX_data);
QString parse_BBXX(QByteArray BBXX_data);
/*异或校验和算法*/
char xor_checksum ( char *buf, int len) ;
/*************************发送数据*****************************/
void send_txsq(long src_user_addr, long dst_user_addr, int transfer_format, char *payload, int payload_len);
void send_icjc();
void send_xtzj();
void send_sjsc();
void send_bbdq();
void send_gljc();
void send_dwsq();
void writeLog(QByteArray data,QString typeName);
void prependText(const QString& text);
public slots:
void readCOMData();
void slot_XTZJ();
void slot_GongLv();
void slot_IC();
void communicationDetection(void);
private slots:
void on_comboBox_more_currentTextChanged(const QString &arg1);
//void on_Con_Send_Btn_clicked();
void slotSerialTimerOut();
void gpsDatasProcessing(QByteArray GPSBuffer);
void RxData();
void on_ClearBtnrdss_clicked();
void on_CleanBtnrdss_clicked();
private slots:
void SendBtn_repeat();//发送内容拆分后多次发送
void clickgy_pushbutton();
public:
void on_OpenBtn();
void on_BBBtn();
void on_ICBtn();
void on_XTZJBtn();
void on_SendBtn();
void on_Single_DW_Btn();
void on_TimeBtn();
void on_GongLvBtn();
void doRdssProgress();
private:
Ui::BeiDou *ui;
QSerialPort *m_serialport;
BD_SerialPortSet *m_bd_serialportset;
QByteArray m_bytearray;
QTimer *m_continue_send_timer;
bool portIsOpen; //串口是否打开
bool isGPSdata;
int sleepTime; //接收延时时间
int sendCount; //发送数据计数
int receiveCount; //接收数据计数
bool serialRead;
long times;
QString bdPort;//连接的端口
QString baud; //波特率
bool flagZJ=false;
QProgressDialog* progDlg=nullptr;
QTimer* timer=nullptr;
int currentValue;
int m_counter=0;
signals:
void signal_XTZJ();
void signal_GongLv();
void signal_IC();
void autoSend_signal();
void TXSQ_recvSignal();
/****************4G/5G通信************************/
public:
void InitSocket();//初始化Socket套接字
void ConnectToServer();//连接服务器
void SendData();//发送数据
void doProcessTcpWrite();
void readFile(int index);
private:
QTcpSocket *myTcpSocket;//Tcp连接套接字
private slots:
void doProssConnected();
void doProcessReadyRead();
void doProssDisconnected();
void on_pushButtonConnect_clicked();
void on_pushButton_Tance_clicked();
void updateProgressDialog();
void on_pushButton_start_clicked();
void on_fileBtn_clicked();
void on_ClearBtn5G_send_clicked();
void on_ClearBtn5g_recv_clicked();
void on_fileBtn_5g_clicked();
void on_ClearBtnwifi_send_clicked();
void on_ClearBtnwifi_recv_clicked();
void on_fileBtn_wifi_clicked();
void on_checkBox_auto_stateChanged(int arg1);
void on_checkBox_sd_stateChanged(int arg1);
void on_SendtextEdit_textChanged();
/******************自动模式********************/
void on_textEdit_send_wifi_textChanged();
void on_textEdit_send_textChanged();
void recvSendEmit();//自动模式通信探测结束后发送数据
void timeCul();//计算时间
private:
bool wifiOrRdss=false;
bool startFlag=false;
qint64 currentTimestamp;//开始发送时间:单位:s
public:
};
#endif // BEIDOU_H
beidou.cpp
#include "beidou.h"
#include "ui_beidou.h"
#include "seriport_global.h"
#include "myhelper.h"
#include <QMessageBox>
#include <QDateTime>
#include <QPalette>
#include <QDebug>
/*********************定义数据协议固定长度****************************/
#define ICJC_FIRM_SIZE 12
#define XTZJ_FIRM_SIZE 13
#define TXSQ_FIRM_SIZE 18
#define SJSC_FIRM_SIZE 13
#define GLJC_FIRM_SIZE 12
#define BBDQ_FIRM_SIZE 11
#define DWSQ_FIRM_SIZE 22
#define TXSQ_PAYLOAD_CHINESE 0b01000100
#define TXSQ_PAYLOAD_BCD 0b01000110
BeiDou::BeiDou(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::BeiDou)
{
ui->setupUi(this);
//this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
this->setWindowIcon(QIcon(":/picture/satellite.png"));
ui->RevtextEdit->setReadOnly(true);//设置不可编辑
ui->Addr_lineEdit->setText("419910");
portIsOpen=false;
isGPSdata=true;
sleepTime = 10; //接收延时时间
sendCount = 0; //发送数据计数
receiveCount = 0; //接收数据计数
ui->Freq_SB->setNum(60);
QPalette palette;
palette.setColor(QPalette::Text,Qt::blue);
//ui->Rev_lineEdit->setPalette(palette);
ui->Send_lineEdit->setPalette(palette);
m_continue_send_timer=new QTimer(this);
connect(this,&BeiDou::signal_XTZJ,this,&BeiDou::slot_XTZJ);
connect(this,&BeiDou::signal_GongLv,this,&BeiDou::slot_GongLv);
connect(this,&BeiDou::signal_IC,this,&BeiDou::slot_IC);
connect(m_continue_send_timer,&QTimer::timeout,this,&BeiDou::SendBtn_repeat);
connect(this,&BeiDou::autoSend_signal,this,&BeiDou:: recvSendEmit);
connect(this,&BeiDou::TXSQ_recvSignal,this,&BeiDou::timeCul);
statusBar()->showMessage("CLOSED");
readSettingInit("D:/hurui/BDS_RDSS/Configure.ini");
//设置通用的图标
ui->tabWidget->setTabIcon(3,QIcon(":/picture/rdssicon.png"));
ui->tabWidget->setTabIcon(1,QIcon(":/picture/5gicon.png"));
ui->tabWidget->setTabIcon(0,QIcon(":/picture/Wi-Fiicon.png"));
ui->tabWidget->setTabIcon(2,QIcon(":/picture/hsicon.png"));
this->setStyleSheet("QMainWindow::titleBar { background-color: red; }");
ui->checkBox_sd->setChecked(true);
//在最右边添加一个控件
QMenuBar *menubar=new QMenuBar(nullptr);
setMenuBar(menubar);//在窗口中设置菜单栏
QPushButton *pushInfo=new QPushButton("关于");
menubar->setCornerWidget(pushInfo,Qt::TopRightCorner);//把控件放到最右边
connect(pushInfo,&QPushButton::clicked,this,&BeiDou::clickgy_pushbutton);
pushInfo->setIcon(QIcon(":/picture/information.png"));
pushInfo->setIconSize(QSize(16,16));
pushInfo->setFont(QFont("Arial", 12, QFont::Bold));
//ui->pushButton_Tance->setEnabled(false);
//ui->pushButton_start->setEnabled(false);
//初始化
InitSocket();
}
BeiDou::~BeiDou()
{
if(portIsOpen)
{
m_serialport->close();
}
delete ui;
}
/****************************连接函数**********************************/
void BeiDou::on_pushButtonConnect_clicked()
{
bool checkAble=ui->checkBox_sd->isChecked();
bool checkAbleAuto=ui->checkBox_auto->isChecked();
if(checkAble)
{
if(ui->tabWidget->currentIndex()==3){on_OpenBtn(); }
if(ui->tabWidget->currentIndex()==1){ConnectToServer(); }
if(ui->tabWidget->currentIndex()==0){ConnectToServer(); }
ui->pushButton_Tance->setEnabled(true);
}
if(checkAbleAuto)
{
ConnectToServer();
QThread::msleep(100);
qDebug()<<"wifiOrRdss:"<<wifiOrRdss<<endl;
if(wifiOrRdss&&startFlag)
{
qDebug()<<"wifiOrRdss"<<endl;
ui->pushButton_Tance->setEnabled(false);
ui->pushButton_start->setEnabled(true);
ui->tabWidget->setCurrentIndex(0);ui->tabWidget->show();
}
if(!wifiOrRdss&&startFlag)
{
qDebug()<<"on_OpenBtn"<<endl;
on_OpenBtn();
ui->tabWidget->setCurrentIndex(3);ui->tabWidget->show();
ui->pushButton_Tance->setEnabled(true);
}
}
}
/****************************打开按钮槽函数**********************************/
void BeiDou::on_OpenBtn()
{
if (ui->pushButtonConnect->text()==" 连接")
{
m_serialport = new QSerialPort(this);
QString tempStr =bdPort;
if(tempStr.isEmpty())
{
QMessageBox::warning(this,"串口打开失败", "无可用串口",QMessageBox::Cancel);
return;
}
m_serialport->setPortName(tempStr);
if (m_serialport->open(QIODevice::ReadWrite))
{
portIsOpen = true;
SerialPortSettings();
statusBar()->showMessage(m_serialport->portName() + " is opened"
+ " Baud:"+BAUD
+" DataBits:"+DATABITS
+" Parity:"+PARITY
+" FlowCtrl:"+FLOWCTRL
+" StopBits:"+STOPBITS );
connect(m_serialport, SIGNAL(readyRead()), this, SLOT(readCOMData()));
ui->pushButtonConnect->setText(" 断开");
ui->pushButtonConnect->setIcon(QIcon(":/picture/disconnectIcon.png")); // 设置按钮的图标,路径根据实际情况替换
ui->pushButtonConnect->setIconSize(QSize(16, 16)); // 设置图标大小
ui->pushButtonConnect->setStyleSheet("color: red;");
}
else
{
QMessageBox::warning(this,
"串口打开失败",
"串口不存在或本串口已经被占用,请重试!",
QMessageBox::Cancel);
return;
}
}
else if (ui->pushButtonConnect->text()==" 断开")
{
if (m_serialport->isOpen())
{
m_serialport->close();
m_serialport->deleteLater();
}
ui->pushButtonConnect->setText(" 连接");
ui->pushButtonConnect->setIcon(QIcon(":/picture/connecticon.png")); // 设置按钮的图标,路径根据实际情况替换
ui->pushButtonConnect->setIconSize(QSize(16, 16)); // 设置图标大小
ui->pushButtonConnect->setStyleSheet("color: rgb(20, 86, 240);");
portIsOpen = false;
statusBar()->showMessage("CLOSED");
}
}
/****************************串口参数配置**********************************/
void BeiDou::SerialPortSettings()
{
if(portIsOpen)
{
//设置波特率
if(baud=="115200")
m_serialport->setBaudRate(QSerialPort::Baud115200);
// else if(BAUD=="57600")
// m_serialport->setBaudRate(QSerialPort::Baud57600);
// else if(BAUD=="38400")
// m_serialport->setBaudRate(QSerialPort::Baud38400);
// else if(BAUD=="19200")
// m_serialport->setBaudRate(QSerialPort::Baud19200);
// else if(BAUD=="9600")
// m_serialport->setBaudRate(QSerialPort::Baud9600);
// else if(BAUD=="4800")
// m_serialport->setBaudRate(QSerialPort::Baud4800);
// else if(BAUD=="2400")
// m_serialport->setBaudRate(QSerialPort::Baud2400);
// else if(BAUD=="1200")
// m_serialport->setBaudRate(QSerialPort::Baud1200);
//设置校验位
// if(PARITY=="无校验")
m_serialport->setParity(QSerialPort::NoParity);
// else if(PARITY=="奇校验")
// m_serialport->setParity(QSerialPort::OddParity);
// else if(PARITY=="偶校验")
// m_serialport->setParity(QSerialPort::EvenParity);
//设置数据位
// if (DATABITS == "8")
m_serialport->setDataBits(QSerialPort::Data8);
// else if (DATABITS == "7")
// m_serialport->setDataBits(QSerialPort::Data7);
// else if (DATABITS == "6")
// m_serialport->setDataBits(QSerialPort::Data6);
// else if (DATABITS == "5")
// m_serialport->setDataBits(QSerialPort::Data5);
//设置流控制
// if (FLOWCTRL== "off")
m_serialport->setFlowControl(QSerialPort::NoFlowControl);
// else if (FLOWCTRL== "hardware")
// m_serialport->setFlowControl(QSerialPort::HardwareControl);
// else if (FLOWCTRL== "xonxoff")
// m_serialport->setFlowControl(QSerialPort::SoftwareControl);
//设置停止位
// if (STOPBITS== "1")
m_serialport->setStopBits(QSerialPort::OneStop);
// else if (STOPBITS== "1.5")
// m_serialport->setStopBits(QSerialPort::OneAndHalfStop);
// else if (STOPBITS== "2")
// m_serialport->setStopBits(QSerialPort::TwoStop);
}
}
//在文本框中添加数据
void BeiDou::append(quint8 type, QString msg)
{
QString str;
if (type == 0)
{
str = ">> 串口发送 :";
ui->RevtextEdit->setTextColor(QColor("dodgerblue"));
}
else if (type == 1)
{
str = "<< 串口接收 :";
ui->RevtextEdit->setTextColor(QColor("magenta"));
}
ui->RevtextEdit->append(QString("[%1] %2 %3").arg(DATETIME).arg(str).arg(msg));
// QTextCursor cursor = ui->RevtextEdit->textCursor();
// cursor.movePosition(QTextCursor::Start);
// ui->RevtextEdit->setTextCursor(cursor);
// ui->RevtextEdit->insertPlainText(QString("[%1] %2 %3").arg(DATETIME).arg(str).arg(msg)+"\n");
QFile file("./log.txt");
if (file.open(QIODevice::Append | QIODevice::Text))
{
QTextStream in(&file);
in<<QStringLiteral("解析后数据:")<<":"<<QString("[%1] %2 %3").arg(DATETIME).arg(str).arg(msg)<<"\n";
file.close();
}
}
/***************************读取串口端缓存数据**********************************/
void BeiDou::readCOMData()
{
if (m_serialport->bytesAvailable() <= 0)
{
return;
}
//myHelper::sleep(sleepTime);
QByteArray data = m_serialport->readAll();
//ui->RevtextEdit->append("RawData:"+QString::fromLocal8Bit(data));
int dataLen = data.length();
if (dataLen <= 0) {
return;
}
QString buffer;
m_bytearray.append(data);
if(m_bytearray.contains('$'))
{
QByteArray first_bytearray='$'+m_bytearray.split('$').at(0);
m_bytearray=m_bytearray.right(m_bytearray.length()-m_bytearray.indexOf('$')-1);
if(first_bytearray.length()<=1)
return;
buffer =parse_data(first_bytearray);
if(!isGPSdata)
{
append(1, buffer);
}
else
{
// if(ui->ShowGPS_CB->isChecked())
// {
// append(1, buffer);
// }
}
}
}
void BeiDou::on_BBBtn()
{
if(portIsOpen)
{
append(0,"版本读取");
send_bbdq();
}
}
void BeiDou::on_ICBtn()
{
if(portIsOpen)
{
append(0,"IC检测");
send_icjc();
}
}
//
void BeiDou::on_XTZJBtn()
{
if(portIsOpen)
{
append(0,"系统自检");
send_xtzj();
}
}
//单次发送
void BeiDou::on_SendBtn()
{
if(portIsOpen)
{
char* payload;
QString str=ui->SendtextEdit->toPlainText();
QByteArray ba = StrToInterCode(str);//字符串转机内码
//QByteArray ba=StrToUniCode(str);//字符串转Unicode码
qDebug()<<"ba.length:"<<ba.length();
payload=ba.data();
int payload_len = strlen((char const *)payload);
for(int i=0;i<payload_len;i++)
{
qDebug()<<"payload[]:"<<payload[i];
}
qDebug()<<"payload_len"<<payload_len;
if(payload_len>210)//电文最大长度1680bits/210bytes
{
QMessageBox::warning(this,
"发送失败!",
QString("电文长度%1bits大于最大长度%2bits").arg(QString::number(payload_len*8),QString::number(1680)),
QMessageBox::Cancel);
return;
}
long src_user_addr=SRC_USER_ADDRESS;
long dst_user_addr=ui->Addr_lineEdit->text().toLong();
int transfer_format=ui->TranType_CB->currentIndex();
DST_USER_ADDRESS=dst_user_addr;
send_txsq(src_user_addr,dst_user_addr,transfer_format,payload,payload_len);
ui->Send_lineEdit->setText(QString::number(ui->Send_lineEdit->text().toInt()+payload_len)+" Byte");
append(0,QString("通信申请 发送端卡号: %1 接收端卡号: %2 发送内容:"+str).arg(QString::number(SRC_USER_ADDRESS),QString::number(DST_USER_ADDRESS)));
doRdssProgress();
}
}
//拆分多次发送
void BeiDou::SendBtn_repeat()
{
int num=ui->SendtextEdit->toPlainText().length()/6;
if(num==m_counter){m_continue_send_timer->stop();}
if(portIsOpen)
{
char* payloadSources;
QString str=ui->SendtextEdit->toPlainText();
QByteArray ba = StrToInterCode(str);//字符串转机内码
//QByteArray ba=StrToUniCode(str);//字符串转Unicode码
qDebug()<<"ba.length:"<<ba.length();
payloadSources=ba.data();
//第一个参数是截取后接收的容器,第二个参数是原字符串截取时指针位置,第三个参数是原字符串指针移动截取的长度
char substr_new[7]={};
strncpy(substr_new, payloadSources + m_counter*6, 6);
substr_new[6] = '\0';
QByteArray byteArray(substr_new);
char*payload=byteArray.data();
QString temStr=QString::fromLocal8Bit(payload);
int payload_len = strlen((char const *)payload);
for(int i=0;i<payload_len;i++)
{
qDebug()<<"payload[]:"<<payload[i];
}
qDebug()<<"payload_len"<<payload_len;
if(payload_len>210)//电文最大长度1680bits/210bytes
{
QMessageBox::warning(this,
"发送失败!",
QString("电文长度%1bits大于最大长度%2bits").arg(QString::number(payload_len*8),QString::number(1680)),
QMessageBox::Cancel);
return;
}
long src_user_addr=SRC_USER_ADDRESS;
long dst_user_addr=ui->Addr_lineEdit->text().toLong();
int transfer_format=ui->TranType_CB->currentIndex();
DST_USER_ADDRESS=dst_user_addr;
send_txsq(src_user_addr,dst_user_addr,transfer_format,payload,payload_len);
ui->Send_lineEdit->setText(QString::number(ui->Send_lineEdit->text().toInt()+payload_len)+" Byte");
append(0,QString("通信申请 发送端卡号: %1 接收端卡号: %2 发送内容:"+temStr).arg(QString::number(SRC_USER_ADDRESS),QString::number(DST_USER_ADDRESS)));
doRdssProgress();
m_counter++;
}
}
void BeiDou::doRdssProgress()
{
currentTimestamp = QDateTime::currentSecsSinceEpoch();
int dataLenth= ui->SendtextEdit->toPlainText().length()/6+1;
ui->progressBar->setRange(0, dataLenth);
ui->progressBar ->setValue(m_counter+1);
QCoreApplication::processEvents();
}
//定位申请
void BeiDou::on_Single_DW_Btn()
{
if(portIsOpen)
{
append(0,"定位申请");
send_dwsq();
}
}
//
void BeiDou::on_TimeBtn()
{
if(portIsOpen)
{
append(0,"时间输出");
send_sjsc();
}
}
//
void BeiDou::on_GongLvBtn()
{
if(portIsOpen)
{
append(0,"功率检测");
send_gljc();
}
}
//
//
//void BeiDou::on_Con_Send_Btn_clicked()
//{
// if(m_continue_send_timer->isActive())
// {
// m_continue_send_timer->stop();
// ui->Con_Send_Btn->setText("连续发送");
// }
// else
// {
// m_continue_send_timer->setInterval(ui->Con_Send_Time_SB->value()*1000);
// m_continue_send_timer->start();
// emit ui->SendBtn->clicked();
// ui->Con_Send_Btn->setText("停止连续发送");
// }
//}
/****************************异或校验和算法******************************/
char BeiDou::xor_checksum( char *buf, int len)
{
int i;
char checksum = 0;
for (i = 0; i < len; ++i)
{
checksum ^= *(buf++);
}
return checksum;
}
/***************************************************************
**************************发送协议指令**************************
* **************************************************************/
/*
1、IC检测协议内容:
icjc:24 49 43 4A 43 00 0C 00 00 00 00 2B
icxx:24 49 43 58 58 00 16 02 AD F7 00 00 00 0B 06 00 3C 03 00 00 00 52
*/
void BeiDou::send_icjc()
{
char send_icjc_data[ICJC_FIRM_SIZE];
/* 1、IC检测指令初始化*/
send_icjc_data[0] = '$';
send_icjc_data[1] = 'I';
send_icjc_data[2] = 'C';
send_icjc_data[3] = 'J';
send_icjc_data[4] = 'C';
/* 2、长度*/
send_icjc_data[5] = ICJC_FIRM_SIZE / 256; //先传高位
send_icjc_data[6] = ICJC_FIRM_SIZE% 256; //再传低位
/* 3、用户地址-当外设获取本机用户信息时, “用户地址”填全“0”*/
send_icjc_data[7] = 0x00;
send_icjc_data[8] = 0x00;
send_icjc_data[9] = 0x00;
/* 4、信息内容-帧号(固定填0)*/
send_icjc_data[10] = 0x00;
/* 5、校验和 */
send_icjc_data[11] = xor_checksum(send_icjc_data, ICJC_FIRM_SIZE - 1);
m_serialport->write(send_icjc_data,ICJC_FIRM_SIZE);
QByteArray icjcArray(send_icjc_data,ICJC_FIRM_SIZE);
QString ICJC_RawData= QString("[%1] %2 ").arg(DATETIME).arg("ICJC_RawData:");
writeLog(icjcArray,ICJC_RawData);
writeLog(icjcArray.toHex(),"ICJC发送数据:");
}
/*
1、XTZJ协议内容:
xtzj:24 58 54 5A 4A 00 0D 02 AD FB 00 00 61
zjxx:24 5a 4a 58 58 00 15 02 AD FB 01 00 64 02 00 00 03 00 02 00 13
*/
void BeiDou::send_xtzj()
{
int frequency=0;
char send_xtzj_data[XTZJ_FIRM_SIZE];
/* 1、系统自检指令初始化*/
send_xtzj_data[0] = '$';
send_xtzj_data[1] = 'X';
send_xtzj_data[2] = 'T';
send_xtzj_data[3] = 'Z';
send_xtzj_data[4] = 'J';
/* 2、长度*/
send_xtzj_data[5] = XTZJ_FIRM_SIZE / 256; //先传高位
send_xtzj_data[6] = XTZJ_FIRM_SIZE % 256; //再传低位
/* 3、用户地址*/
send_xtzj_data[7] = SRC_USER_ADDRESS/ 65536;
send_xtzj_data[8] = ( SRC_USER_ADDRESS % 65536) / 256;
send_xtzj_data[9] = ( SRC_USER_ADDRESS % 65536) % 256;
/* 4、信息内容- 自检频度*/
send_xtzj_data[10] = frequency / 256;
send_xtzj_data[11] = frequency % 256;
/* 5、校验和 */
send_xtzj_data[12] = xor_checksum(send_xtzj_data, XTZJ_FIRM_SIZE-1);
m_serialport->write(send_xtzj_data,XTZJ_FIRM_SIZE);
QByteArray xtzjArray(send_xtzj_data,XTZJ_FIRM_SIZE);
QString XTZJ_RawData= QString("[%1] %2 ").arg(DATETIME).arg("XTZJ_RawData:");
writeLog(xtzjArray,XTZJ_RawData);
writeLog(xtzjArray.toHex(),"XTZJ发送数据:");
}
/******************************TXSQ协议***********************************/
void BeiDou::send_txsq(long src_user_addr, long dst_user_addr, int transfer_format, char *payload, int payload_len)
{
char send_txsq_data[TXSQ_FIRM_SIZE+payload_len];
/* 1、通信申请指令初始化,不采用memcpy等库函数,提高指令执行效率,只有涉及到大量数据赋值拷贝时才考虑用库函数 */
send_txsq_data[0] = '$';
send_txsq_data[1] = 'T';
send_txsq_data[2] = 'X';
send_txsq_data[3] = 'S';
send_txsq_data[4] = 'Q';
/* 2、包长度,先传高位,再传低位 */
send_txsq_data[5] = (TXSQ_FIRM_SIZE + payload_len) / 256;
send_txsq_data[6] = (TXSQ_FIRM_SIZE + payload_len) % 256;
/* 3、源用户地址 */
send_txsq_data[7] =src_user_addr/ 65536;
send_txsq_data[8] = (src_user_addr% 65536) / 256;
send_txsq_data[9] =(src_user_addr% 65536) % 256;
/* 4.1、信息-信息类别 */
if (transfer_format == 0) //汉字
{
send_txsq_data[10] = TXSQ_PAYLOAD_CHINESE;//0b01000100;
}
else //代码/混发
{
send_txsq_data[10] = TXSQ_PAYLOAD_BCD;//0b01000110
}
/* 4.2、信息-目的用户地址 */
send_txsq_data[11] =dst_user_addr/ 65536;
send_txsq_data[12] =(dst_user_addr% 65536) / 256;
send_txsq_data[13] =(dst_user_addr% 65536) % 256;
/* 4.3、信息-电文净荷长度-单位是bit */
send_txsq_data[14] = (payload_len * 8) / 256;
send_txsq_data[15] = (payload_len * 8) % 256;
/* 4.4、信息-是否应答 */
send_txsq_data[16] = 0;
/* 4.5、信息-电文内容 */
memcpy(&send_txsq_data[17] , payload, payload_len);
/* 5、校验和 */
send_txsq_data[TXSQ_FIRM_SIZE + payload_len -1] = xor_checksum(send_txsq_data, (TXSQ_FIRM_SIZE + payload_len -1));
m_serialport->write(send_txsq_data,TXSQ_FIRM_SIZE + payload_len);
QByteArray txsqArray(send_txsq_data,TXSQ_FIRM_SIZE + payload_len);
QString TXSQ_RawData= QString("[%1] %2 ").arg(DATETIME).arg("TXSQ_RawData:");
writeLog(txsqArray,TXSQ_RawData);
writeLog(txsqArray.toHex(),"TXSQ发送数据:");
}
/******************************DWSQ协议***********************************/
void BeiDou::send_dwsq()
{
char send_dwsq_data[DWSQ_FIRM_SIZE];
/* 1、定位申请指令初始化*/ /* 2、长度*/ /* 3、用户地址*/ /* 4.1、信息内容- 信息类别*/ /* 5、校验和 */
send_dwsq_data[0] = '$';
send_dwsq_data[1] = 'D';
send_dwsq_data[2] = 'W';
send_dwsq_data[3] = 'S';
send_dwsq_data[4] = 'Q';
/* 2、长度*/
send_dwsq_data[5] = DWSQ_FIRM_SIZE/ 256; //先传高位
send_dwsq_data[6] = DWSQ_FIRM_SIZE% 256; //再传低位
/* 3、用户地址*/
send_dwsq_data[7] = SRC_USER_ADDRESS/ 65536;
send_dwsq_data[8] = ( SRC_USER_ADDRESS % 65536) / 256;
send_dwsq_data[9] = ( SRC_USER_ADDRESS % 65536) % 256;
/* 4.1、信息内容- 信息类别*/
send_dwsq_data[10] = 0x00;
/* 4.2、信息内容- 高程数据和天线高*/
send_dwsq_data[11] = 0x00;
send_dwsq_data[12] = 0x00;
send_dwsq_data[13] = 0x00;
send_dwsq_data[14] = 0x00;
/* 4.3、信息内容- 气压数据*/
send_dwsq_data[15] = 0x00;
send_dwsq_data[16] = 0x00;
send_dwsq_data[17] = 0x00;
send_dwsq_data[18] = 0x00;
/* 4.4、信息内容- 入站频度*/
send_dwsq_data[19] = 0x00;
send_dwsq_data[20] = 0x00;
/* 5、校验和 */
send_dwsq_data[21] = xor_checksum(send_dwsq_data, DWSQ_FIRM_SIZE- 1);
m_serialport->write(send_dwsq_data,DWSQ_FIRM_SIZE);
QByteArray dwsqArray(send_dwsq_data,DWSQ_FIRM_SIZE);
QString DWSQ_RawData= QString("[%1] %2 ").arg(DATETIME).arg("DWSQ_RawData:");
writeLog(dwsqArray,DWSQ_RawData);
writeLog(dwsqArray.toHex(),"DWSQ发送数据:");
}
/******************************SJSC协议***********************************/
void BeiDou::send_sjsc()
{
char send_sjsc_data[SJSC_FIRM_SIZE];
/* 1、时间输出指令初始化*/
send_sjsc_data[0] = '$';
send_sjsc_data[1] = 'S';
send_sjsc_data[2] = 'J';
send_sjsc_data[3] = 'S';
send_sjsc_data[4] = 'C';
/* 2、长度*/
send_sjsc_data[5] = SJSC_FIRM_SIZE / 256; //先传高位
send_sjsc_data[6] = SJSC_FIRM_SIZE% 256; //再传低位
/* 3、用户地址*/
send_sjsc_data[7] = SRC_USER_ADDRESS/ 65536;
send_sjsc_data[8] = ( SRC_USER_ADDRESS % 65536) / 256;
send_sjsc_data[9] = ( SRC_USER_ADDRESS % 65536) % 256;
/* 4、信息内容-输出频度-单次*/
send_sjsc_data[10] = 0x00;
send_sjsc_data[11] = 0x00;
/* 5、校验和 */
send_sjsc_data[12] = xor_checksum(send_sjsc_data, SJSC_FIRM_SIZE - 1);
m_serialport->write(send_sjsc_data,SJSC_FIRM_SIZE);
QByteArray sjscArray(send_sjsc_data,SJSC_FIRM_SIZE);
QString SJSC_RawData= QString("[%1] %2 ").arg(DATETIME).arg("SJSC_RawData:");
writeLog(sjscArray,SJSC_RawData);
writeLog(sjscArray.toHex(),"SJSC发送数据:");
}
/******************************GLJC协议***********************************/
void BeiDou::send_gljc()
{
char send_gljc_data[GLJC_FIRM_SIZE];
/* 1、功率检测指令初始化*/
send_gljc_data[0] = '$';
send_gljc_data[1] = 'G';
send_gljc_data[2] = 'L';
send_gljc_data[3] = 'J';
send_gljc_data[4] = 'C';
/* 2、长度*/
send_gljc_data[5] = GLJC_FIRM_SIZE / 256; //先传高位
send_gljc_data[6] = GLJC_FIRM_SIZE% 256; //再传低位
/* 3、用户地址*/
send_gljc_data[7] = SRC_USER_ADDRESS/ 65536;
send_gljc_data[8] = ( SRC_USER_ADDRESS % 65536) / 256;
send_gljc_data[9] = ( SRC_USER_ADDRESS % 65536) % 256;
/* 4、信息内容-输出频度-单次*/
send_gljc_data[10] = 0x00;
/* 5、校验和 */
send_gljc_data[11] = xor_checksum(send_gljc_data, GLJC_FIRM_SIZE - 1);
m_serialport->write(send_gljc_data,GLJC_FIRM_SIZE);
QByteArray gljcArray(send_gljc_data,GLJC_FIRM_SIZE);
QString GLJC_RawData= QString("[%1] %2 ").arg(DATETIME).arg("GLJC_RawData:");
writeLog(gljcArray,GLJC_RawData);
writeLog(gljcArray.toHex(),"GLJC发送数据:");
}
/******************************BBDQ协议***********************************/
void BeiDou::send_bbdq()
{
//ui->RevtextEdit->append("into send_bbdq");
char send_bbdq_data[BBDQ_FIRM_SIZE];
/* 1、版本读取指令初始化*/
send_bbdq_data[0] = '$';
send_bbdq_data[1] = 'B';
send_bbdq_data[2] = 'B';
send_bbdq_data[3] = 'D';
send_bbdq_data[4] = 'Q';
/* 2、长度*/
send_bbdq_data[5] = BBDQ_FIRM_SIZE / 256; //先传高位
send_bbdq_data[6] = BBDQ_FIRM_SIZE% 256; //再传低位
/* 3、用户地址*/
send_bbdq_data[7] = SRC_USER_ADDRESS/ 65536;
send_bbdq_data[8] = ( SRC_USER_ADDRESS % 65536) / 256;
send_bbdq_data[9] = ( SRC_USER_ADDRESS % 65536) % 256;
/* 4、校验和 */
send_bbdq_data[10] = xor_checksum(send_bbdq_data, BBDQ_FIRM_SIZE - 1);
m_serialport->write(send_bbdq_data,BBDQ_FIRM_SIZE);
QByteArray bbdqArray(send_bbdq_data,GLJC_FIRM_SIZE);
QString BBDQ_RawData= QString("[%1] %2 ").arg(DATETIME).arg("BBDQ_RawData:");
writeLog(bbdqArray,BBDQ_RawData);
writeLog(bbdqArray.toHex(),"BBDQ发送数据:");
}
/***************************************************************
**************************解析协议数据**************************
***************************************************************/
/**************************解析数据*********************************/
QString BeiDou::parse_data(QByteArray data)
{
if(data.isEmpty() || data.count() < 3)
return "";
if(data.at(1)=='I'&&data.at(2)=='C')
{
writeLog(data,"ICXX_Raw:");
writeLog(data.toHex(),"ICXX接收数据:");
isGPSdata=false;
return parse_ICXX(data);
}
else if(data.at(1)=='Z'&&data.at(2)=='J')
{
writeLog(data,"ZJXX_Raw:");
writeLog(data.toHex(),"ZJXX接收数据:");
isGPSdata=false;
return parse_ZJXX(data);
}
else if(data.at(1)=='T'&&data.at(2)=='X')
{
writeLog(data,"TXXX_Raw:");
writeLog(data.toHex(),"TXXX接收数据:");
isGPSdata=false;
return parse_TXXX(data);
}
else if(data.at(1)=='F'&&data.at(2)=='K')
{
writeLog(data,"FKXX_Raw:");
writeLog(data.toHex(),"FKXX接收数据:");
isGPSdata=false;
return parse_FKXX(data);
}
else if(data.at(1)=='D'&&data.at(2)=='W')
{
writeLog(data,"DWXX_Raw:");
writeLog(data.toHex(),"DWXX接收数据:");
isGPSdata=false;
return parse_DWXX(data);
}
else if(data.at(1)=='S'&&data.at(2)=='J')
{
writeLog(data,"SJXX_Raw:");
writeLog(data.toHex(),"SJXX接收数据:");
isGPSdata=false;
return parse_SJXX(data);
}
else if(data.at(1)=='G'&&data.at(2)=='L')
{
writeLog(data,"GLXX_Raw:");
writeLog(data.toHex(),"GLXX接收数据:");
isGPSdata=false;
return parse_GLXX(data);
}
else if(data.at(1)=='B'&&data.at(2)=='B')
{
writeLog(data,"BBXX_Raw:");
writeLog(data.toHex(),"BBXX接收数据:");
isGPSdata=false;
return parse_BBXX(data);
}
else
{
isGPSdata=true;
return parse_GPS(data);
}
}
/**************************解析ICXX数据*********************************/
QString BeiDou::parse_ICXX(QByteArray ICXX_data)
{
long ICXX_address=(unsigned char)ICXX_data[7]*65536+(unsigned char)ICXX_data[8]*256+(unsigned char)ICXX_data[9];
int ICXX_serveFrequency=(unsigned char)ICXX_data[15]*256+(unsigned char)ICXX_data[16];
int ICXX_tongboID=(unsigned char)ICXX_data[11]*65536+(unsigned char)ICXX_data[12]*256+(unsigned char)ICXX_data[13];
int ICXX_level=ICXX_data[17];
int ICXX_jiami=ICXX_data[18];
QString ICXX_jiami_biaozhi;
if(ICXX_jiami==0)
ICXX_jiami_biaozhi="非密用户";
else
ICXX_jiami_biaozhi="保密用户";
SRC_USER_ADDRESS=ICXX_address;
ui->User_Addr_lineEdit->setText(QString::number(ICXX_address));
ui->Freq_lineEdit->setText(QString::number(ICXX_serveFrequency)+"s");
ui->Tongbo_lineEdit->setText(QString::number(ICXX_tongboID));
ui->Level_lineEdit->setText(QString::number(ICXX_level));
emit signal_IC();
return "ID:"+QString::number(ICXX_address)+" 通播:"+QString::number(ICXX_tongboID)+" 频度:"+QString::number(ICXX_serveFrequency)+"s"+" 等级:"+QString::number(ICXX_level)+" 保密:"+ICXX_jiami_biaozhi;
}
/**************************解析ZJXX数据*********************************/
QString BeiDou::parse_ZJXX(QByteArray ZJXX_data)
{
QString ZJXX_IC,ZJXX_hardware,ZJXX_dianliang,ZJXX_ruzhan,ZJXX_yizhi;
if((unsigned char)ZJXX_data[10]==0x00)
ZJXX_IC="0";
else
ZJXX_IC="error";
if((unsigned char)ZJXX_data[11]==0x00)
ZJXX_hardware="0";
else
ZJXX_hardware="error";
if((unsigned char)ZJXX_data[12]==0x00)
ZJXX_dianliang="0";
else
{
int ZJXX_remain=(unsigned char)ZJXX_data[12];
ZJXX_dianliang=QString("剩余1/%1").arg(QString::number(ZJXX_remain));
}
if((ZJXX_data[13]&0x02)==0x02)//(ZJXX_data[13]&0x02)==0x02需加括号先进行括号内的按位与运算再进行判断,否则若为ZJXX_data[13]&0x02==0x02会先进行右边的判断再进行按位与运算
ZJXX_ruzhan="可以入站" ;
else
ZJXX_ruzhan="不可以入站";
if((ZJXX_data[13]&0x01)==0x01)
ZJXX_yizhi="抑制";
else
ZJXX_yizhi="非抑制";
int ZJXX_GL_1=ZJXX_data[14];
int ZJXX_GL_2=ZJXX_data[15];
int ZJXX_GL_3=ZJXX_data[16];
int ZJXX_GL_4=ZJXX_data[17];
int ZJXX_GL_5=ZJXX_data[18];
int ZJXX_GL_6=ZJXX_data[19];
QString ZJXX_GL=QString::number(ZJXX_GL_1)+"-"+QString::number(ZJXX_GL_2)+"-"
+QString::number(ZJXX_GL_3)+"-"+QString::number(ZJXX_GL_4)+"-"
+QString::number(ZJXX_GL_5)+"-"+QString::number(ZJXX_GL_6);
ui->GLZK_lineEdit->setText(ZJXX_GL);
emit signal_XTZJ();
return "IC卡状态:"+ZJXX_IC+" 硬件状态:"+ZJXX_hardware+" 电池电量:"+ZJXX_dianliang+" 入站状态:"+ZJXX_ruzhan+" "+ZJXX_yizhi+
" 功率状况:"+ZJXX_GL;
}
/**************************解析FKXX数据*********************************/
QString BeiDou::parse_FKXX(QByteArray FKXX_data)
{
unsigned int FKXX_fk=FKXX_data[10];
QString FKXX_str;
if(FKXX_fk==0x00)
{
for(int i=11;i<15;i++)
{
FKXX_str+=FKXX_data[i];
}
FKXX_str+=":成功";//失败 信号未锁定 电量不足 发射频度未到 加解密错误 CRC错误
}
else if(FKXX_fk==0x01)
{
for(int i=11;i<15;i++)
{
FKXX_str+=FKXX_data[i];
}
FKXX_str+=":失败";
}
else if(FKXX_fk==0x02)
{
FKXX_str="信号未锁定";
}
else if(FKXX_fk==0x03)
{
FKXX_str="电量不足";
}
else if(FKXX_fk==0x04)
{
int wait_time=FKXX_data[11];
FKXX_str="发射频度未到,需要等待"+QString::number(wait_time)+"s";
}
else if(FKXX_fk==0x05)
{
FKXX_str="加解密错误";
}
else if(FKXX_fk==0x06)
{
for(int i=11;i<15;i++)
{
FKXX_str+=FKXX_data[i];
}
FKXX_str+=":CRC错误";
}
else
{
FKXX_str="unknown error";
}
return FKXX_str;
}
/**************************解析GPS数据*********************************/
QString BeiDou::parse_GPS(QByteArray GPS_data)
{
QString GPS_str=myHelper::byteArrayToAsciiStr(GPS_data);
return GPS_str;
}
/**************************解析TXXX数据*********************************/
QString BeiDou::parse_TXXX(QByteArray TXXX_data)
{
int TXXX_length=(unsigned char)TXXX_data[5]*256+(unsigned char)TXXX_data[6];
long TXXX_sender_address=(unsigned char)TXXX_data[11]*65536+(unsigned char)TXXX_data[12]*256+(unsigned char)TXXX_data[13];
unsigned char TXXX_type=TXXX_data[10];
qDebug()<<"TXXX_length:"<<TXXX_length;
qDebug()<<"(unsigned char)17:"<<(unsigned char)TXXX_data[17];
unsigned char date_16=TXXX_data[16];//必须使用unsigned char 否则会出现-128-127的值
unsigned char date_17=TXXX_data[17];//必须使用unsigned char 否则会出现-128-127的值
int TXXX_length_bits=date_16*256+date_17;//此时单位为bit
int TXXX_length_byte=TXXX_length_bits/8;//此时单位为byte
qDebug()<<"TXXX_length_byte:"<<TXXX_length_byte;
QByteArray TXXX_temp;
//for(int i=19;i<19+TXXX_length_byte;i++)
for(int i=18;i<18+TXXX_length_byte;i++)
{
qDebug()<<QString("TXXX_data[%1]:").arg(QString::number(i))<<TXXX_data[i];
TXXX_temp.append(TXXX_data[i]);
}
QString TXXX_str;
if(TXXX_type==0b01000000)
{
TXXX_str=QStringLiteral("传输方式:汉字")+" "+QStringLiteral("接收信息内容:")+QString::fromLocal8Bit( TXXX_temp);
}
else if(TXXX_type==0b01100000)
{
TXXX_str=QStringLiteral("传输方式:BCD")+" "+QStringLiteral("接收信息内容:")+TXXX_temp;
emit TXSQ_recvSignal();
}
//ui->Rev_lineEdit->setText(QString::number(ui->Rev_lineEdit->text().toInt()+TXXX_length_byte));
return QStringLiteral("发送端卡号:")+QString::number(TXXX_sender_address)+" "+QStringLiteral("接收端卡号:")+QString::number(SRC_USER_ADDRESS)+":"+TXXX_str;
}
/**************************解析BBXX数据*********************************/
QString BeiDou::parse_BBXX(QByteArray BBXX_data)
{
int BBXX_length=(unsigned char)BBXX_data[5]*256+(unsigned char)BBXX_data[6];
QString BBXX_str;
for(int i=10;i<10+BBXX_length-BBDQ_FIRM_SIZE;i++)
{
BBXX_str+=BBXX_data[i];
}
return BBXX_str;
}
/**************************解析DWXX数据*********************************/
QString BeiDou::parse_DWXX(QByteArray DWXX_data)
{
int DWXX_user_addr=(unsigned char)DWXX_data[7]*65536+(unsigned char)DWXX_data[8]*256+(unsigned char)DWXX_data[9];
int DWXX_query_addr=(unsigned char)DWXX_data[11]*65536+(unsigned char)DWXX_data[12]*256+(unsigned char)DWXX_data[13];
int DWXX_time_hour=DWXX_data[14];
int DWXX_time_minute=DWXX_data[15];
float DWXX_time_second=(unsigned char)DWXX_data[16]+0.01*(unsigned char)DWXX_data[17];
//大地经度
int DWXX_L_degree=DWXX_data[18];
int DWXX_L_minute=DWXX_data[19];
float DWXX_L_second=(unsigned char)DWXX_data[20]+0.01*(unsigned char)DWXX_data[21];
//大地纬度
int DWXX_B_degree=DWXX_data[22];
int DWXX_B_minute=DWXX_data[23];
float DWXX_B_second=(unsigned char)DWXX_data[24]+0.01*(unsigned char)DWXX_data[25];
int a=DWXX_data[26];
int b=DWXX_data[27];
qDebug()<<"a:"<<a;
qDebug()<<"b:"<<b;
unsigned char DWXX_height_high=DWXX_data[26];
unsigned char DWXX_height_low=DWXX_data[27];
unsigned char DWXX_height_high_low6=DWXX_height_high&0x3f;
int DWXX_height=DWXX_height_high_low6*256+DWXX_height_low;
//判断DWXX_height-高度的符号
if((DWXX_height_high&0xc0)==0x40) //需加括号先进行括号内的按位与运算再进行判断,否则若会先进行右边的判断再进行按位与运算
{
DWXX_height*=-1;
}
unsigned char DWXX_Herror_high=DWXX_data[28];
unsigned char DWXX_Herror_low=DWXX_data[29];
int DWXX_Herror=DWXX_Herror_low;
//判断DWXX_Herror-误差高度的符号
if(DWXX_Herror_high==0x01)
{
DWXX_Herror*=-1;
}
QString DWXX_str=QString("用户地址:%1 查询地址:%2 %3时%4分%5秒").arg(QString::number(DWXX_user_addr),QString::number(DWXX_query_addr),
QString::number(DWXX_time_hour),QString::number(DWXX_time_minute), QString::number(DWXX_time_second))+
QString(" 经度:%1度%2分%3秒 纬度:%4度%5分%6秒 高度:%7 高度异常:%8").arg(QString::number(DWXX_L_degree),QString::number(DWXX_L_minute),
QString::number(DWXX_L_second), QString::number(DWXX_B_degree),QString::number(DWXX_B_minute),
QString::number(DWXX_B_second),QString::number(DWXX_height),QString::number(DWXX_Herror));
return DWXX_str;
}
/**************************解析SJXX数据*********************************/
QString BeiDou::parse_SJXX(QByteArray SJXX_data)
{
int SIXX_year=(unsigned char)SJXX_data[10]*256+(unsigned char)SJXX_data[11];
int SIXX_month=(unsigned char)SJXX_data[12];
int SIXX_day=(unsigned char)SJXX_data[13];
int SIXX_hour=(unsigned char)SJXX_data[14];
int SIXX_minute=(unsigned char)SJXX_data[15];
int SIXX_second=(unsigned char)SJXX_data[16];
return QString("时间信息:%1/%2/%3 %4:%5:%6").arg(QString::number(SIXX_year),QString::number(SIXX_month),QString::number(SIXX_day),QString::number(SIXX_hour),QString::number(SIXX_minute),QString::number(SIXX_second));
}
/**************************解析GLXX数据*********************************/
QString BeiDou::parse_GLXX(QByteArray GLXX_data)
{
int GLXX_1=GLXX_data[10];
int GLXX_2=GLXX_data[11];
int GLXX_3=GLXX_data[12];
int GLXX_4=GLXX_data[13];
int GLXX_5=GLXX_data[14];
int GLXX_6=GLXX_data[15];
QString GLXX_GL= QString("%1-%2-%3-%4-%5-%6").arg(QString::number(GLXX_1),QString::number(GLXX_2),QString::number(GLXX_3),QString::number(GLXX_4),QString::number(GLXX_5),QString::number(GLXX_6));
ui->GLZK_lineEdit->setText(GLXX_GL);
emit signal_GongLv();
return "功率状况:"+GLXX_GL;
}
/***************************字符串转内码*****************************/
QByteArray BeiDou::StrToInterCode(const QString &str)
{
QByteArray code=str.toLocal8Bit();
//QString strName=str.toLocal8Bit();
//QByteArray code;
//code.append(strName);
qDebug()<<"code.length():"<<code.length();
for(int i=0;i<code.length();i++)
{
int a=code[i];
qDebug()<<"int code[i]:"<<a;
}
return code;
}
/****************内码转字符串,要求为双节数********************/
//Linux默认是UTF-8编码,其汉字包含3个字节
QString BeiDou::interCodeToStr(const QByteArray &data)
{
QString str;
QByteArray temp;
qDebug()<<"length:"<<data.length();
for(int i=0;i<data.length();i+2)
{
temp.append(data[i]);
temp.append(data[i+1]);
}
str=QString::fromLocal8Bit(temp);
qDebug ()<< "intercode To string :"<<str;
return str;
}
// 字符串转Unicode码
QByteArray BeiDou::StrToUniCode(QString str)
{
// 这里传来的字符串一定要加tr,main函数里可以加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
QString stt = str;
QByteArray data;
const QChar *q;
QChar qtmp;
int num;
q=stt.unicode();
int len=stt.count();
for(int i=0;i<len;i++)
{
qtmp =(QChar)*q++;
num= qtmp.unicode();
quint8 hi = (quint8)(num >> 8);
quint8 lo = (quint8)(num);
data.append (hi);
data.append (lo);
}
qDebug ()<<"string to unicode :"<<QObject::tr("%1").arg (data.toHex ().data ());
return data;
}
//Unicode码转字符串
QString BeiDou::UniCodeToStr(QByteArray data)
{
QByteArray data_1;
for(int i= 0;i<data.length();i+=2)
{
data_1.append (data[i]);
data_1.append (data[i+1]);
}
QString str = data_1.toHex ().data ();
int temp[840];
QChar qchar[210];
QString strOut;
bool ok;
int count=str.count();
int len=count/4;
for(int i=0;i<count;i+=4)
{
temp[i]=str.mid(i,4).toInt(&ok,16);//每四位转化为16进制整型
qchar[i/4]=temp[i];
QString str0(qchar, len);
strOut=str0;
}
qDebug ()<<"unicode to string:"<<strOut;
return strOut;
}
//void BeiDou::continue_send_timer_timeout()
//{
// emit ui->SendBtn->clicked();
//}
// 接收数据槽函数
void BeiDou::RxData()
{
QString rxString;
m_bytearray.append(m_serialport->readAll());
//qDebug() << QString(rxArray);
if( serialRead == true )
{
// 数据对齐,如果上次数据是一半,抛弃数据,重新接受
times++;
rxString = QString(m_bytearray);
//qDebug() << "rec:" << rxString;
ui->RevtextEdit->append(tr("--------------------------------------------------------------------------"));
ui->RevtextEdit->append("从北斗GPS传感器第("+QString::number(times)+")次接受数据:");
ui->RevtextEdit->append(tr("--------------------------------------------------------------------------"));
ui->RevtextEdit->append(QString(m_bytearray));
gpsDatasProcessing( m_bytearray );
m_bytearray.clear();
serialRead = false;
if( times%50 == 0 ) {
ui->RevtextEdit->clear();
}
ui->RevtextEdit->append(tr("--------------------------------------------------------------------------\r"));
}
else
{
return;
}
// 解析数据
}
void BeiDou::gpsDatasProcessing(QByteArray GPSBuffer)
{
QString GPSBufferString = QString( GPSBuffer );
int error_pos = 0;
QString GNRMC_String = NULL;
QString GPGGA_String = NULL;
QString GPGSV_String = NULL;
QString GPRMC_String = NULL;
QString GPGLL_String = NULL;
QString GNGGA_String = NULL;
bool latiflag = false;
bool atiflag = false;
bool utcflag = false;
bool speedflag = false;
bool longtiflag = false;
QList<QString> gpsStringList = GPSBufferString.split('\n');
// 由于定时间隔,数据包发生黏连,纠正数据。
if( gpsStringList.at(0).at(0) != '$' ) {
QString ErrorString = gpsStringList.at(gpsStringList.length()-1) + gpsStringList.at(0);
error_pos = 1;
if( ErrorString.contains("$GNTX") ){
GNRMC_String = ErrorString;
}else if( ErrorString.contains("$GNPX") ) {
GPGGA_String = ErrorString;
}else if( ErrorString.contains("$GNVX") ) {
GPGSV_String = ErrorString;
}
}else{
error_pos = 0;
}
// 从QList中得到数据
for( int i = error_pos; i < gpsStringList.length()- error_pos; i++ ) {
if( gpsStringList.at(i).contains("$GNTX") ){
GNRMC_String = gpsStringList.at(i);
}else if( gpsStringList.at(i).contains("$GNPX") ) {
GPGGA_String = gpsStringList.at(i);
}else if( gpsStringList.at(i).contains("$GNVX") ) {
GPGSV_String = gpsStringList.at(i);
}
}
}
void BeiDou::slotSerialTimerOut()
{
if( serialRead == false ){
serialRead = true;
}
}
void BeiDou:: writeLog(QByteArray data,QString typeName)
{
QFile file("./log.txt");
if (file.open(QIODevice::Append | QIODevice::Text))
{
QTextStream in(&file);
in<<typeName<<":"<<data<<"\n";
file.close();
}
}
void BeiDou::prependText(const QString& text)
{
QTextCursor cursor = ui->RevtextEdit->textCursor();
cursor.movePosition(QTextCursor::Start);
ui->RevtextEdit->setTextCursor(cursor);
ui->RevtextEdit->insertPlainText(text + "\n");
}
//配置文件读取
void BeiDou::readSettingInit(QString fileName)
{
QSettings *settings = new QSettings(fileName,QSettings::IniFormat);
settings->beginGroup("RDSS");
bdPort = settings->value("BDPort").toString();
ui->label_port->setText(bdPort);
baud = settings->value("BAUD").toString();
ui->label_baud->setText(baud);
QString bdType = settings->value("BDType").toString();
ui->label_bd_type->setText(bdType);
QString bdCardType = settings->value("BDCardType").toString();
ui->label_bd_card_type->setText(bdCardType);
if(bdType.contains("二"))
{
ui->label_MaxByte->setText("78 Byte");
}
else if(bdType.contains("三")&&bdCardType.contains("一"))
{
ui->label_MaxByte->setText("98 Byte");
}
else if(bdType.contains("三")&&bdCardType.contains("二"))
{
ui->label_MaxByte->setText("262 Byte");
}
else if(bdType.contains("三")&&bdCardType.contains("三"))
{
ui->label_MaxByte->setText("554 Byte");
}
else if(bdType.contains("三")&&bdCardType.contains("四"))
{
ui->label_MaxByte->setText("1138 Byte");
}
else if(bdType.contains("三")&&bdCardType.contains("五"))
{
ui->label_MaxByte->setText("2000 Byte");
}
settings->endGroup();
}
void BeiDou::on_comboBox_more_currentTextChanged(const QString &arg1)
{
if(arg1=="系统自检")
{
//qDebug()<<"XTZJ"<<endl;
on_XTZJBtn();
}
else if(arg1=="功率检测")
{
on_GongLvBtn();
//qDebug()<<"Gon"<<endl;
}
else if(arg1=="版本读取")
{
on_BBBtn();
//qDebug()<<"bbbtn"<<endl;
}
else if(arg1=="IC检测")
{
on_ICBtn();
//qDebug()<<"IC"<<endl;
}
else if(arg1=="时间输出")
{
on_TimeBtn();
//qDebug()<<"time"<<endl;
}
else if(arg1=="单次定位")
{
on_Single_DW_Btn();
//qDebug()<<"DW"<<endl;
}
}
void BeiDou::on_pushButton_Tance_clicked()
{
ui->pushButton_start->setEnabled(true);
progDlg = new QProgressDialog();
progDlg->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
progDlg->setWindowTitle("通信探测");
progDlg->setLabelText("通信探测中..");
progDlg->setFixedWidth(300);
progDlg->setRange(0, 100);
progDlg->show();
timer = new QTimer();
currentValue = 0;
progDlg->setValue(currentValue);
if(ui->tabWidget->currentIndex()==1||ui->tabWidget->currentIndex()==0)
{
timer->start(100);
connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressDialog()));
}
if(ui->tabWidget->currentIndex()==3)
{
timer->start(500);
connect(timer, SIGNAL(timeout()), this, SLOT(communicationDetection()));
}
}
void BeiDou::communicationDetection(void)
{
currentValue= currentValue+1;
progDlg ->setValue(currentValue);
QCoreApplication::processEvents();
if(progDlg->wasCanceled())
progDlg->setHidden(true);//隐藏对话框
if( currentValue == 5)
{
on_XTZJBtn();
flagZJ=true;
}
if( currentValue == 20 )
{
on_GongLvBtn();
flagZJ=true;
}
if( currentValue == 30 )
{
on_ICBtn();
flagZJ=true;
}
if(currentValue==100)
{
currentValue = 0;
delete progDlg;//关闭进度对话框
//耗时操作完成后,关闭进度对话框
timer->stop();//停止定时器
if(ui->checkBox_auto->isChecked())
{
emit autoSend_signal();
}
if(!ui->RevtextEdit->toPlainText().contains("正常"))
{
ui->RevtextEdit->append(">>>系统自检:异常!");
ui->RevtextEdit->append(">>>功率检测:异常!");
ui->RevtextEdit->append(">>>IC检测:异常!");
}
}
}
void BeiDou::slot_XTZJ()
{
if(flagZJ)
{
ui->RevtextEdit->append(">>>系统自检:正常!");
}
}
void BeiDou::slot_GongLv()
{
if(flagZJ)
{
ui->RevtextEdit->append(">>>功率检测:正常!");
}
}
void BeiDou::slot_IC()
{
if(flagZJ)
{
ui->RevtextEdit->append(">>>IC检测:正常!");
}
}
void BeiDou:: updateProgressDialog()
{
currentValue= currentValue+2;
progDlg ->setValue(currentValue);
QCoreApplication::processEvents();
if(progDlg->wasCanceled())
progDlg->setHidden(true);//隐藏对话框
if( currentValue == 100 )
{
currentValue = 0;
//耗时操作完成后,关闭进度对话框
timer->stop();//停止定时器
delete progDlg;//关闭进度对话框
uint myPort= ui->lineEdit_port->text().toUInt();
myTcpSocket->connectToHost(QHostAddress(ui->lineEdit_ip->text()),myPort);
if (myTcpSocket->state() == QAbstractSocket::ConnectingState)
{
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append( ">>>连接服务器正常!");
//myTcpSocket->disconnectFromHost();
ui->pushButtonConnect->click();
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append( ">>>连接服务器正常!");
//myTcpSocket->disconnectFromHost();
ui->pushButtonConnect->click();
}
}
else
{
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append( ">>>请检查服务器是否正常开启或输入的服务器地址端口号是否正确!");
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append( ">>>请检查服务器是否正常开启或输入的服务器地址端口号是否正确!");
}
}
QTcpSocket socket;
QString host = "www.baidu.com"; // 要ping的主机名
int port = 80; // 使用常用的HTTP端口
socket.connectToHost(host, port);
if(socket.waitForConnected(5000))
{
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append(">>>本地网络:正常!");
socket.close();
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append(">>>本地网络:正常!");
socket.close();
}
}
else
{
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append(">>>本地网络:异常!");
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append(">>>本地网络:异常!");
}
}
}
}
/**********************通用型界面操作-发送*********************************/
void BeiDou::on_pushButton_start_clicked()
{
bool checkAble=ui->checkBox_sd->isChecked();
bool checkAbleAuto=ui->checkBox_auto->isChecked();
if(checkAble&&!checkAbleAuto)
{
if(ui->tabWidget->currentIndex()==3&&!ui->SendtextEdit->toPlainText().isEmpty())
{
qDebug()<<"into ui->SendtextEdit"<<endl;
ui->Send_lineEdit->setText("0");
ui->label_sulv->setText("0");
ui->progressBar->setValue(0);
QString rdssLength=ui->SendtextEdit->toPlainText();
if(rdssLength.length()<7)
{
qDebug()<<"No auto"<<endl;
on_SendBtn();
}
else
{
ui->Send_lineEdit->setText("0");
ui->label_sulv->setText("0");
ui->progressBar->setValue(0);
if(m_continue_send_timer->isActive())
{
m_continue_send_timer->stop();
}
else
{
qDebug()<<"No auto SendBtn_repeat"<<endl;
m_continue_send_timer->setInterval(120*1000);
m_continue_send_timer->start();
m_counter=0;
SendBtn_repeat();
}
}
}
if(ui->tabWidget->currentIndex()==1&&!ui->textEdit_send->toPlainText().isEmpty())
{
ui->label_time_4G->setText("0");
ui->label_speed_4G->setText("0");
doProcessTcpWrite();
}
if(ui->tabWidget->currentIndex()==0&&!ui->textEdit_send_wifi->toPlainText().isEmpty())
{
ui->label_time_wifi->setText("0");
ui->label_speed_wifi->setText("0");
doProcessTcpWrite();
}
}
if(checkAbleAuto&&!checkAble)
{
if(wifiOrRdss)
{
ui->label_time_wifi->setText("0");
ui->label_speed_wifi->setText("0");
ui->tabWidget->setCurrentIndex(0);
ui->tabWidget->show();
doProcessTcpWrite();
}
else
{
ui->Send_lineEdit->setText("0");
ui->label_sulv->setText("0");
ui->progressBar->setValue(0);
if(ui->User_Addr_lineEdit->text()=="0")
{
on_pushButton_Tance_clicked();
ui->tabWidget->setCurrentIndex(3);
ui->tabWidget->show();
}
else
{
ui->progressBar->setValue(0);
ui->tabWidget->setCurrentIndex(3);
ui->tabWidget->show();
QString rdssLength=ui->SendtextEdit->toPlainText();
if(rdssLength.length()<7)
{
qDebug()<<"is auto"<<endl;
on_SendBtn();
}
else
{
if(m_continue_send_timer->isActive())
{
m_continue_send_timer->stop();
}
else
{
qDebug()<<"into SendBtn_repeat****"<<endl;
m_continue_send_timer->setInterval(120*1000);
m_continue_send_timer->start();
m_counter=0;
SendBtn_repeat();
}
}
}
}
}
}
//读取文件
void BeiDou::on_fileBtn_clicked()
{
readFile(ui->tabWidget->currentIndex());
}
void BeiDou::on_ClearBtnrdss_clicked()
{
ui->SendtextEdit->clear();
ui->label_total->setText("0");
ui->Send_lineEdit->setText("0");
ui->label_sulv->setText("0");
}
void BeiDou::on_CleanBtnrdss_clicked()
{
ui->RevtextEdit->clear();
}
void BeiDou::on_SendtextEdit_textChanged()
{
QString text= ui->SendtextEdit->toPlainText();
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); // 使用 UTF-8 编码
int bytes = codec->fromUnicode(text).length(); // 计算字节数
ui->label_total->setText(QString::number(bytes)+" Byte");
}
void BeiDou::recvSendEmit()
{
QString rdssLength=ui->SendtextEdit->toPlainText();
if(rdssLength.length()<7)
{
qDebug()<<"first is auto"<<endl;
on_SendBtn();
}
else
{
if(m_continue_send_timer->isActive())
{
m_continue_send_timer->stop();
}
else
{
m_continue_send_timer->setInterval(120*1000);
m_continue_send_timer->start();
SendBtn_repeat();
}
}
}
void BeiDou::timeCul()
{
qint64 recvCurrentTimestamp = QDateTime::currentSecsSinceEpoch();
double timeData=recvCurrentTimestamp-currentTimestamp;
double b_s= LENGTH/timeData;
ui->label_sulv->setText(QString::number(b_s,'f',2)+" B/s");
}
/*
人生搏击四十不晚,开拓者精神
创业千难夙夜求新,企业家本色
*/
/*-----------------------------4G/5G WIFI Client------------------*/
void BeiDou::InitSocket()
{
myTcpSocket=new QTcpSocket(this);
//由于connectToHost没有返回值,所以通过三个connect来判断和服务器的状态
connect(myTcpSocket,SIGNAL(disconnected()),this,SLOT(doProssDisconnected()));
connect(myTcpSocket,SIGNAL(connected()),this,SLOT(doProssConnected()));
connect(myTcpSocket,SIGNAL(readyRead()),this,SLOT(doProcessReadyRead()));
}
void BeiDou::ConnectToServer()
{
if(ui->pushButtonConnect->text()==" 连接")
{
qDebug()<<"connect"<<endl;
QString ServceIp=ui->lineEdit_ip->text();
QString ServcePort=ui->lineEdit_port->text();
myTcpSocket->connectToHost(QHostAddress(ServceIp),ServcePort.toUInt());
startFlag=true;
}
else if(ui->pushButtonConnect->text()==" 断开")
{
myTcpSocket->disconnectFromHost();
startFlag=false;
}
}
void BeiDou:: doProssConnected()
{
qDebug()<<"doProssConnected"<<endl;
ui->pushButtonConnect->setText(" 断开");
ui->pushButtonConnect->setIcon(QIcon(":/picture/disconnectIcon.png")); // 设置按钮的图标,路径根据实际情况替换
ui->pushButtonConnect->setIconSize(QSize(16, 16)); // 设置图标大小
ui->pushButtonConnect->setStyleSheet("color: red;");
if(ui->checkBox_auto->isChecked())
{
ui->tabWidget->setCurrentIndex(0);
ui->tabWidget->show();
QThread::sleep(0.05);
}
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append(QStringLiteral("连接服务器成功!"));
wifiOrRdss=true;
}
if(ui->tabWidget->currentIndex()==0)
{
qDebug()<<"textEdit_recv_wifi"<<endl;
ui->textEdit_recv_wifi->append(QStringLiteral("连接服务器成功!"));
wifiOrRdss=true;
}
}
//读取服务端发送的数据
void BeiDou::doProcessReadyRead()
{
QTcpSocket *myTcpSocket=(QTcpSocket *)this->sender();
//读取服务器向缓冲区的存储数据
QByteArray data;
while (!myTcpSocket->atEnd())
{
QByteArray tempData= myTcpSocket->readAll();
data=tempData;
}
QString tempStr=QString::fromUtf8(data);
QString tempData=QStringLiteral("服务端->客户端发送数据:")+tempStr;
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append(tempData);
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append(tempData);
}
}
void BeiDou::doProssDisconnected()
{
ui->pushButtonConnect->setText(" 连接");
ui->pushButtonConnect->setIcon(QIcon(":/picture/connecticon.png")); // 设置按钮的图标,路径根据实际情况替换
ui->pushButtonConnect->setIconSize(QSize(16, 16)); // 设置图标大小
ui->pushButtonConnect->setStyleSheet("color: rgb(20, 86, 240);");
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append(QStringLiteral("客户端和服务器断开连接!"));
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append(QStringLiteral("客户端和服务器断开连接!"));
}
}
//向服务器写入数据
void BeiDou::doProcessTcpWrite()
{
QString readDataStr;
if(ui->tabWidget->currentIndex()==1)
{
readDataStr=ui->textEdit_send->toPlainText();
}
if(ui->tabWidget->currentIndex()==0)
{
readDataStr=ui->textEdit_send_wifi->toPlainText();
}
if(!readDataStr.isEmpty())
{
QElapsedTimer timer;
timer.start();
QByteArray readDataMsgByte=readDataStr.toLocal8Bit();
int ret= myTcpSocket->write(readDataMsgByte);
myTcpSocket->waitForBytesWritten();//等待数据发送完成
qint64 elapsedTime = timer.nsecsElapsed(); // 获取经过的时间,单位为纳秒
double timeMs=(double) elapsedTime/1000000;
QString time=QString::number(timeMs,'f',3)+" ms";
QString firstData;
if(ui->tabWidget->currentIndex()==1)
{
ui->label_time_4G->setText(time);
firstData= ui->label_total_4G->text().split(" ").first();
}
if(ui->tabWidget->currentIndex()==0)
{
ui->label_time_wifi->setText(time);
firstData= ui->label_total_wifi->text().split(" ").first();
}
uint dataByte=firstData.toUInt();
double kb_s=(double)dataByte/elapsedTime*1000000;//单位b/ns
QString m_s=QString::number((int)kb_s/1024)+" MB/s";
if(ui->tabWidget->currentIndex()==1)
{
ui->label_speed_4G->setText(m_s);
}
if(ui->tabWidget->currentIndex()==0)
{
ui->label_speed_wifi->setText(m_s);
}
if(ret<0)
{
return;
}
else
{
QString tempData=QStringLiteral("客户端->服务端发送数据:")+readDataStr;
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_recv->append(tempData);
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_recv_wifi->append(tempData);
}
}
}
else
{
if(ui->tabWidget->currentIndex()==1)
{
ui->textEdit_send->append(QStringLiteral("请勿发送空数据!"));
}
if(ui->tabWidget->currentIndex()==0)
{
ui->textEdit_send_wifi->append(QStringLiteral("请勿发送空数据!"));
}
}
}
void BeiDou::on_ClearBtn5G_send_clicked()
{
ui->textEdit_send->clear();
ui->label_total_4G->setText("0");
ui->label_time_4G->setText("0");
ui->label_speed_4G->setText("0");
}
void BeiDou::on_ClearBtn5g_recv_clicked()
{
ui->textEdit_recv->clear();
}
void BeiDou::on_fileBtn_5g_clicked()
{
readFile(ui->tabWidget->currentIndex());
}
void BeiDou::readFile(int index)
{
//文本文件路径
QString curPath=QDir::currentPath();
QString dlgTitle= QString::fromUtf8("请选择发送文件");
QString filter=(QStringLiteral("文本文件(*.txt *.doc *.docx)"));
QString fileName=QFileDialog::getOpenFileName(this, dlgTitle,curPath,filter);
//qDebug()<<"aFileName"<<ODataFileName<<endl;
if(!fileName.isEmpty())
{
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&file);
QString line = in.readLine(); // 逐行读取文本内容
while (!line.isNull())
{
if(index==0)
{
ui->textEdit_send_wifi->append(line);
QString firstData= ui->label_total_wifi->text().split(" ").first();
int dataLength= firstData.toUInt()+line.length();
QString data=QString::number(dataLength)+" Byte";
ui->label_total_wifi->setText(data);
}
if(index==1)
{
ui->textEdit_send->append(line);
QString firstData= ui->label_total_4G->text().split(" ").first();
int dataLength= firstData.toUInt()+line.length();
QString data=QString::number(dataLength)+" Byte";
ui->label_total_4G->setText(data);
}
if(index==3)
{
ui->SendtextEdit->append(line);
QString firstData= ui->label_total->text().split(" ").first();
int dataLength= firstData.toUInt()+line.length();
QString data=QString::number(dataLength)+" Byte";
ui->label_total->setText(data);
}
line = in.readLine();
}
file.close();
}
}
}
/***********************WIFI*********************************/
void BeiDou::on_ClearBtnwifi_send_clicked()
{
ui->textEdit_send_wifi->clear();
ui->label_total_wifi->setText("0");
ui->label_time_wifi->setText("0");
ui->label_speed_wifi->setText("0");
}
void BeiDou::on_ClearBtnwifi_recv_clicked()
{
ui->textEdit_recv_wifi->clear();
}
void BeiDou::on_fileBtn_wifi_clicked()
{
readFile(ui->tabWidget->currentIndex());
}
void BeiDou::on_checkBox_auto_stateChanged(int arg1)
{
if(arg1==2)
{
ui->checkBox_sd->setChecked(false);
}
}
void BeiDou::on_checkBox_sd_stateChanged(int arg1)
{
if(arg1==2)
{
ui->checkBox_auto->setChecked(false);
}
}
void BeiDou::clickgy_pushbutton()
{
QUiLoader loader;
QFile file("D:/hurui/BDS_RDSS/information.ui");
file.open(QFile::ReadOnly);
QWidget *myWidget = loader.load(&file);
myWidget->setWindowTitle(QStringLiteral("关于"));
myWidget->setWindowFlags(myWidget->windowFlags() & ~Qt::WindowMinMaxButtonsHint);
myWidget->setWindowIcon(QIcon(":/picture/information.png"));
if(myWidget != nullptr)
{
myWidget->show();
}
}
void BeiDou::on_textEdit_send_wifi_textChanged()
{
QString text= ui->textEdit_send_wifi->toPlainText();
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); // 使用 UTF-8 编码
int bytes = codec->fromUnicode(text).length(); // 计算字节数
ui->label_total_wifi->setText(QString::number( bytes)+" Byte");
}
void BeiDou::on_textEdit_send_textChanged()
{
QString text= ui->textEdit_send->toPlainText();
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); // 使用 UTF-8 编码
int bytes = codec->fromUnicode(text).length(); // 计算字节数
ui->label_total_4G->setText(QString::number(bytes)+" Byte");
}
myhelper.h
#include <QtCore>
#include <QtGui>
//#include <QtNetwork>
//#include <QtXml>
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
#define TIMEMS qPrintable (QTime::currentTime().toString("HH:mm:ss zzz"))
#define TIME qPrintable (QTime::currentTime().toString("HH:mm:ss"))
#define QDATE qPrintable (QDate::currentDate().toString("yyyy-MM-dd"))
#define QTIME qPrintable (QTime::currentTime().toString("HH-mm-ss"))
#define DATETIME qPrintable (QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
#define STRDATETIME qPrintable (QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"))
#define STRDATETIMEMS qPrintable (QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss-zzz"))
#define AppName "ComTool"
#define AppPath qApp->applicationDirPath()
#define AppDeskWidth qApp->desktop()->availableGeometry().width()
#define AppDeskHeight qApp->desktop()->availableGeometry().height()
#ifndef MYHELPER_H
#define MYHELPER_H
class myHelper: public QObject
{
public:
static void setUTF8Code()
{
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
#endif
}
//设置指定样式
static void setStyle(const QString &qssFile)
{
QFile file(qssFile);
if (file.open(QFile::ReadOnly)) {
QString qss = QLatin1String(file.readAll());
qApp->setStyleSheet(qss);
QString PaletteColor = qss.mid(20, 7);
qApp->setPalette(QPalette(QColor(PaletteColor)));
file.close();
}
}
//延时
static void sleep(int msec)
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while (QTime::currentTime() < dieTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
}
//窗体居中显示
static void formInCenter(QWidget *frm)
{
int frmX = frm->width();
int frmY = frm->height();
QDesktopWidget w;
int deskWidth = w.availableGeometry().width();
int deskHeight = w.availableGeometry().height();
QPoint movePoint(deskWidth / 2 - frmX / 2, deskHeight / 2 - frmY / 2);
frm->move(movePoint);
}
//设置系统日期时间
static void setSystemDateTime(QString year, QString month, QString day, QString hour, QString min, QString sec)
{
#ifdef Q_OS_WIN
QProcess p(0);
p.start("cmd");
p.waitForStarted();
p.write(QString("date %1-%2-%3\n").arg(year).arg(month).arg(day).toLatin1());
p.closeWriteChannel();
p.waitForFinished(1000);
p.close();
p.start("cmd");
p.waitForStarted();
p.write(QString("time %1:%2:%3.00\n").arg(hour).arg(min).arg(sec).toLatin1());
p.closeWriteChannel();
p.waitForFinished(1000);
p.close();
#else
QString cmd = QString("date %1%2%3%4%5.%6").arg(month).arg(day).arg(hour).arg(min).arg(year).arg(sec);
system(cmd.toLatin1());
system("hwclock -w");
#endif
}
static QString byteArrayToHexStr(QByteArray data)
{
QString temp = "";
QString hex = data.toHex();
for (int i = 0; i < hex.length(); i = i + 2) {
temp += hex.mid(i, 2) + " ";
}
return temp.trimmed().toUpper();
}
static QString byteArrayToAsciiStr(QByteArray data)
{
QString temp;
int len = data.size();
for (int i = 0; i < len; i++) {
//0x20为空格,空格以下都是不可见字符
char b = data.at(i);
if (0x00 == b) {
temp += QString("\\NUL");
} else if (0x01 == b) {
temp += QString("\\SOH");
} else if (0x02 == b) {
temp += QString("\\STX");
} else if (0x03 == b) {
temp += QString("\\ETX");
} else if (0x04 == b) {
temp += QString("\\EOT");
} else if (0x05 == b) {
temp += QString("\\ENQ");
} else if (0x06 == b) {
temp += QString("\\ACK");
} else if (0x07 == b) {
temp += QString("\\BEL");
} else if (0x08 == b) {
temp += QString("\\BS");
} else if (0x09 == b) {
temp += QString("\\HT");
} else if (0x0A == b) {
temp += QString("\\LF");
} else if (0x0B == b) {
temp += QString("\\VT");
} else if (0x0C == b) {
temp += QString("\\FF");
} else if (0x0D == b) {
temp += QString("\\CR");
} else if (0x0E == b) {
temp += QString("\\SO");
} else if (0x0F == b) {
temp += QString("\\SI");
} else if (0x10 == b) {
temp += QString("\\DLE");
} else if (0x11 == b) {
temp += QString("\\DC1");
} else if (0x12 == b) {
temp += QString("\\DC2");
} else if (0x13 == b) {
temp += QString("\\DC3");
} else if (0x14 == b) {
temp += QString("\\DC4");
} else if (0x15 == b) {
temp += QString("\\NAK");
} else if (0x16 == b) {
temp += QString("\\SYN");
} else if (0x17 == b) {
temp += QString("\\ETB");
} else if (0x18 == b) {
temp += QString("\\CAN");
} else if (0x19 == b) {
temp += QString("\\EM");
} else if (0x1A == b) {
temp += QString("\\SUB");
} else if (0x1B == b) {
temp += QString("\\ESC");
} else if (0x1C == b) {
temp += QString("\\FS");
} else if (0x1D == b) {
temp += QString("\\GS");
} else if (0x1E == b) {
temp += QString("\\RS");
} else if (0x1F == b) {
temp += QString("\\US");
} else if (0x7F == b) {
temp += QString("\\x7F");
} else if (0x5C == b) {
temp += QString("\\x5C");
} else if (0x20 >= b) {
temp += QString("\\x%1").arg(decimalToStrHex((quint8)b));
} else {
temp += QString("%1").arg(b);
}
}
return temp.trimmed();
}
static QByteArray hexStrToByteArray(QString str)
{
QByteArray senddata;
int hexdata, lowhexdata;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len / 2);
char lstr, hstr;
for (int i = 0; i < len;) {
hstr = str.at(i).toLatin1();
if (hstr == ' ') {
i++;
continue;
}
i++;
if (i >= len) {
break;
}
lstr = str.at(i).toLatin1();
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;
}
static QByteArray asciiStrToByteArray(QString str)
{
QByteArray buffer;
int len = str.length();
QString letter;
QString hex;
for (int i = 0; i < len; i++) {
letter = str.at(i);
if (letter == "\\") {
i++;
letter = str.mid(i, 1);
if (letter == "x") {
i++;
hex = str.mid(i, 2);
buffer.append(strHexToDecimal(hex));
i++;
continue;
} else if (letter == "N") {
i++;
hex = str.mid(i, 1);
if (hex == "U") {
i++;
hex = str.mid(i, 1);
if (hex == "L") { //NUL=0x00
buffer.append((char)0x00);
continue;
}
} else if (hex == "A") {
i++;
hex = str.mid(i, 1);
if (hex == "K") { //NAK=0x15
buffer.append(0x15);
continue;
}
}
} else if (letter == "S") {
i++;
hex = str.mid(i, 1);
if (hex == "O") {
i++;
hex = str.mid(i, 1);
if (hex == "H") { //SOH=0x01
buffer.append(0x01);
continue;
} else { //SO=0x0E
buffer.append(0x0E);
i--;
continue;
}
} else if (hex == "T") {
i++;
hex = str.mid(i, 1);
if (hex == "X") { //STX=0x02
buffer.append(0x02);
continue;
}
} else if (hex == "I") { //SI=0x0F
buffer.append(0x0F);
continue;
} else if (hex == "Y") {
i++;
hex = str.mid(i, 1);
if (hex == "N") { //SYN=0x16
buffer.append(0x16);
continue;
}
} else if (hex == "U") {
i++;
hex = str.mid(i, 1);
if (hex == "B") { //SUB=0x1A
buffer.append(0x1A);
continue;
}
}
} else if (letter == "E") {
i++;
hex = str.mid(i, 1);
if (hex == "T") {
i++;
hex = str.mid(i, 1);
if (hex == "X") { //ETX=0x03
buffer.append(0x03);
continue;
} else if (hex == "B") { //ETB=0x17
buffer.append(0x17);
continue;
}
} else if (hex == "O") {
i++;
hex = str.mid(i, 1);
if (hex == "T") { //EOT=0x04
buffer.append(0x04);
continue;
}
} else if (hex == "N") {
i++;
hex = str.mid(i, 1);
if (hex == "Q") { //ENQ=0x05
buffer.append(0x05);
continue;
}
} else if (hex == "M") { //EM=0x19
buffer.append(0x19);
continue;
} else if (hex == "S") {
i++;
hex = str.mid(i, 1);
if (hex == "C") { //ESC=0x1B
buffer.append(0x1B);
continue;
}
}
} else if (letter == "A") {
i++;
hex = str.mid(i, 1);
if (hex == "C") {
i++;
hex = str.mid(i, 1);
if (hex == "K") { //ACK=0x06
buffer.append(0x06);
continue;
}
}
} else if (letter == "B") {
i++;
hex = str.mid(i, 1);
if (hex == "E") {
i++;
hex = str.mid(i, 1);
if (hex == "L") { //BEL=0x07
buffer.append(0x07);
continue;
}
} else if (hex == "S") { //BS=0x08
buffer.append(0x08);
continue;
}
} else if (letter == "C") {
i++;
hex = str.mid(i, 1);
if (hex == "R") { //CR=0x0D
buffer.append(0x0D);
continue;
} else if (hex == "A") {
i++;
hex = str.mid(i, 1);
if (hex == "N") { //CAN=0x18
buffer.append(0x18);
continue;
}
}
} else if (letter == "D") {
i++;
hex = str.mid(i, 1);
if (hex == "L") {
i++;
hex = str.mid(i, 1);
if (hex == "E") { //DLE=0x10
buffer.append(0x10);
continue;
}
} else if (hex == "C") {
i++;
hex = str.mid(i, 1);
if (hex == "1") { //DC1=0x11
buffer.append(0x11);
continue;
} else if (hex == "2") { //DC2=0x12
buffer.append(0x12);
continue;
} else if (hex == "3") { //DC3=0x13
buffer.append(0x13);
continue;
} else if (hex == "4") { //DC2=0x14
buffer.append(0x14);
continue;
}
}
} else if (letter == "F") {
i++;
hex = str.mid(i, 1);
if (hex == "F") { //FF=0x0C
buffer.append(0x0C);
continue;
} else if (hex == "S") { //FS=0x1C
buffer.append(0x1C);
continue;
}
} else if (letter == "H") {
i++;
hex = str.mid(i, 1);
if (hex == "T") { //HT=0x09
buffer.append(0x09);
continue;
}
} else if (letter == "L") {
i++;
hex = str.mid(i, 1);
if (hex == "F") { //LF=0x0A
buffer.append(0x0A);
continue;
}
} else if (letter == "G") {
i++;
hex = str.mid(i, 1);
if (hex == "S") { //GS=0x1D
buffer.append(0x1D);
continue;
}
} else if (letter == "R") {
i++;
hex = str.mid(i, 1);
if (hex == "S") { //RS=0x1E
buffer.append(0x1E);
continue;
}
} else if (letter == "U") {
i++;
hex = str.mid(i, 1);
if (hex == "S") { //US=0x1F
buffer.append(0x1F);
continue;
}
} else if (letter == "V") {
i++;
hex = str.mid(i, 1);
if (hex == "T") { //VT=0x0B
buffer.append(0x0B);
continue;
}
} else if (letter == "\\") {
//如果连着的是多个\\则对应添加\对应的16进制0x5C
buffer.append(0x5C);
continue;
} else {
//将对应的\[前面的\\也要加入
buffer.append(0x5C);
buffer.append(letter.toLatin1());
continue;
}
}
buffer.append(str.mid(i, 1).toLatin1());
}
return buffer;
}
static char convertHexChar(char ch)
{
if ((ch >= '0') && (ch <= '9')) {
return ch - 0x30;
} else if ((ch >= 'A') && (ch <= 'F')) {
return ch - 'A' + 10;
} else if ((ch >= 'a') && (ch <= 'f')) {
return ch - 'a' + 10;
} else {
return (-1);
}
}
static QString decimalToStrHex(int decimal)
{
QString temp = QString::number(decimal, 16);
if (temp.length() == 1) {
temp = "0" + temp;
}
return temp.toUpper();
}
static int strHexToDecimal(QString strHex)
{
bool ok;
return strHex.toInt(&ok, 16);
}
};
#endif // MYHELPER_H
seriport_global.h
#ifndef SERIPORT_GLOBAL_H
#define SERIPORT_GLOBAL_H
#include <QString>
extern QString PORTNAME;
extern QString BAUD;
extern QString DATABITS;
extern QString PARITY;
extern QString FLOWCTRL;
extern QString STOPBITS;
extern long SRC_USER_ADDRESS;
extern long DST_USER_ADDRESS;
#endif // SERIPORT_GLOBAL_H
seriport_global.cpp
#include "seriport_global.h"
QString PORTNAME="";
QString BAUD="";
QString DATABITS="";
QString PARITY="";
QString FLOWCTRL="";
QString STOPBITS="";
long SRC_USER_ADDRESS=0;
long DST_USER_ADDRESS=0;