关于QT的TCP与UART的接收和发送,可实现远程或者本地TCP转成串口信号控制单片机
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