通用串口TCP测试工具

本文介绍使用QT实现TCP与UART数据转换的方法,通过创建主界面和线程处理,实现远程或本地TCP信号到串口信号的转换,用于控制单片机。详细介绍了工程配置、主界面和线程处理的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.程序包括ui主界面和Qthread线程

工程.pro中应该有 QT += core gui network widgets serialport

1.1.主界面头文件widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QNetworkInterface>
#include <QtNetwork/QTcpSocket>
#include "xthread.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void initSerialPort();

public slots:
    void btn_connect_clicked();
    void btn_send_clicked();
    void uart_open_clicked();
    void doProcessNewConnection();
    void doProcessAcceptError(QAbstractSocket::SocketError);
    void doProcessDisconnected();
    void doProcessReadyread();
    void doProcessUartread(const QByteArray data);
private:
    Ui::Widget *ui;
    QTcpServer *myServer;
    QTcpSocket *client;
    xThread *my_thread;
};

#endif // WIDGET_H
#endif // WIDGET_H

1.2.主界面.C文件 widget.c

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    #include <QMessageBox>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        ui->btn_send->setEnabled(false);
        //getIPAddress();
        myServer = new QTcpServer(this);
        my_thread = new xThread;
        initSerialPort();
    
        connect(my_thread, &xThread::uart_Response, this, &Widget::doProcessUartread);    
    }

Widget::~Widget()
{
    delete ui;
}
void Widget::initSerialPort()
{
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        my_thread->MySerial.setPort(info);
        if(my_thread->MySerial.open(QIODevice::ReadWrite))
        {
            ui->comboBox->addItem(info.portName());
            my_thread->MySerial.close();
        }
    }

}
void Widget::btn_connect_clicked()
{
    QString myAddr;
    QString myPort;
    //方法2,手动设置
    myAddr = ui->lineEdit_serverip->text();
    myPort = ui->lineEdit_serverport->text();

    QString msg;
    bool ret = myServer->listen(QHostAddress(myAddr),myPort.toUInt());
    if(!ret)
    {
        msg =QStringLiteral("绑定失败!");
    }
    else
    {
        msg =QStringLiteral("绑定成功!");
        ui->btn_connect->setEnabled(false);
    }
    ui->textEdit->append(msg);

    myServer->setMaxPendingConnections(2);

    connect(myServer,SIGNAL(newConnection()),
            this,SLOT(doProcessNewConnection()));
    connect(myServer,SIGNAL(acceptError(QAbstractSocket::SocketError)),
            this,SLOT(doProcessAcceptError(QAbstractSocket::SocketError)));

}
void Widget::btn_send_clicked()
{
    QString msg = ui->textEdit_2->toPlainText();
    client->write(msg.toUtf8());

    ui->textEdit_2->clear();
}
void Widget::uart_open_clicked()
{
    if(ui->btn_open->text()=="打开串口")
    {
        my_thread->MySerial.setPortName(ui->comboBox->currentText());
        if(my_thread->MySerial.open(QIODevice::ReadWrite))
        {
            my_thread->MySerial.setBaudRate(9600);
            my_thread->MySerial.setDataBits(QSerialPort::Data8);
            my_thread->MySerial.setParity(QSerialPort::NoParity);
            my_thread->MySerial.setFlowControl(QSerialPort::NoFlowControl);
            my_thread->MySerial.setStopBits(QSerialPort::OneStop);
            ui->btn_open->setText("关闭串口");
            ui->comboBox->setEnabled(false);
            my_thread->start();
        }
        else
        {
           QMessageBox::about(NULL, "提示", "打开串口失败");
        }
    }else
    {
        ui->btn_open->setText("打开串口");
        ui->comboBox->setEnabled(true);
        my_thread->MySerial.close();
        my_thread->xThreadStop();
    }
}
void Widget::doProcessUartread(const QByteArray data)
{
    client->write(data);
    QString str1 = QStringLiteral("串口说:");
    QString msg;
    QString str2;
    if(ui->checkBox->isChecked())
    {
        for(int i = 0; i < data.count(); i++){
           QString s;
           s.sprintf("%02X ", (unsigned char)data.at(i));
           str2 += s;
        }
    }else
    {
       str2=QString(data);
    }
    msg = QStringLiteral("%1%2").arg(str1).arg(str2);
    ui->textEdit->append(msg);

}
void Widget::doProcessNewConnection()
{
    client = myServer->nextPendingConnection();
    QString msg = QStringLiteral("客户端[%1:%2]连接!")
            .arg(client->peerAddress().toString())
            .arg(client->peerPort());
    ui->textEdit->append(msg);
    ui->btn_send->setEnabled(true);
    //客户端断开
    connect(client,SIGNAL(disconnected()),
            this,SLOT(doProcessDisconnected()));
    //读取内容
    connect(client,SIGNAL(readyRead()),
            this,SLOT(doProcessReadyread()));
}

void Widget::doProcessAcceptError(QAbstractSocket::SocketError err)
{
    qDebug()<<err;
}

void Widget::doProcessDisconnected()
{
//    QTcpSocket *client = (QTcpSocket *)this->sender();
    QString msg = QStringLiteral("客户端[%1:%2]退出!")
            .arg(client->peerAddress().toString())
            .arg(client->peerPort());
    ui->textEdit->append(msg);
}

void Widget::doProcessReadyread()
{
//    QTcpSocket *client = (QTcpSocket *)this->sender();
    QString str1 = QStringLiteral("客户端[%1:%2]说:")
            .arg(client->peerAddress().toString())
            .arg(client->peerPort());
    QString msg;
    QString str2;
    QByteArray aa;
    QByteArray bb;

    while(!client->atEnd())
    {
        aa = client->readAll();
        bb +=aa;
//        str2.append(QString(client->readAll()));
    }
    if(ui->checkBox->isChecked())
    {
        for(int i = 0; i < bb.count(); i++){
           QString s;
           s.sprintf("%02X ", (unsigned char)bb.at(i));
           str2 += s;
        }
    }
    else
    {
       str2=QString(bb);
    }
    if(ui->btn_open->text()=="关闭串口")
    {              
        my_thread->MySerial.write(bb);
    }
    msg = QStringLiteral("%1%2").arg(str1).arg(str2);
    ui->textEdit->append(msg);
}
//************************************************
char ConvertChar2Hex(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);
    }
QByteArray QString2Hex(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[i].toLatin1();   //字符型
       if(hstr == ' ')
       {
           i++;
           continue;
       }
       i++;
       if(i >= len)
           break;
       lstr = str[i].toLatin1();
       hexdata = ConvertChar2Hex(hstr);
       lowhexdata = ConvertChar2Hex(lstr);
       if((hexdata == -1) || (lowhexdata == -1))
           break;
       else
           hexdata = hexdata*16+lowhexdata;
       i++;
       senddata[hexdatalen] = (char)hexdata;
       hexdatalen++;
   }
   senddata.resize(hexdatalen);
   return senddata;
}

2.1.线程处理头文件xThread.h

#ifndef XTHREAD_H
#define XTHREAD_H

#include <QObject>
#include <QThread>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>


class xThread : public QThread
{
    Q_OBJECT
public:
    explicit xThread(QObject *parent = nullptr) : QThread(parent)
    {

    }
    ~xThread()
    {
        xthreadExitFlag=false;
    }
    void run();
    void xThreadStop()
    {
        this->xthreadExitFlag=false;
    }
signals:
    void uart_Response(const QByteArray data);

public:
    QSerialPort MySerial;
private:
    bool xthreadExitFlag;
    uint8_t overUartTime;
    QByteArray oneFrameUartData;
};

#endif // XTHREAD_H

#endif // XTHREAD_H

2.2.线程处理c文件xThread.c

#include "xthread.h"
#include <QDebug>
#include <QByteArray>


void xThread::run()
{
    uint8_t xThread_Status;
    xthreadExitFlag=true;
    xThread_Status=0;
    overUartTime=10;
    QByteArray Data;
    while (xthreadExitFlag)
    {
       // qDebug()<<"thread";
        switch(xThread_Status)
        {
            case 0:
                if(MySerial.isOpen())
                {
                    Data = MySerial.readAll();//读取串口数据
                    if(!Data.isEmpty())
                    {
                        overUartTime=10;
                        oneFrameUartData =Data;
                        xThread_Status=1;
                    }
                }
                break;
            case 1:
                Data = MySerial.readAll();//读取串口数据
                if(!Data.isEmpty())
                {
                    overUartTime=10;
                    oneFrameUartData +=Data;
                }
                if(overUartTime==0)
                {
                    emit uart_Response(oneFrameUartData);
                    xThread_Status=0;
                    overUartTime=10;
                }
                break;
            default:
                break;
        }

      QThread::msleep(10);
      if((overUartTime>0)&&xThread_Status)
          overUartTime--;
    }

    qDebug()<<"get out";
}

2.运行结果如下

在这里插入图片描述

3,可执行软件下载

链接: link.

我用QT时间不算太久,小伙伴们如果有更好的思路或者想法,可以留言或者发我的邮箱:17688704926@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值