北斗短报文RDSS通信

北斗短报文通信通过北斗卡实现短报文的发送,通过串口读取和解析对应的数据。

定位申请

$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;

 

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值