一、51的硬件代码,使用keil5软件编写
//main.c
#include <REGX52.H>
#include "Uart.h"
int main()
{
UART_Init();
while(1)
{
}
return 0;
}
void UART_Routine() interrupt 4
{
if(RI == 1)
{
//当接收到数据的时候,让控制led的P2端口等于串口数据缓冲寄存器中的值,从而实现串口控制led灯
P2 = SBUF; //LED点亮
UART_SendByte(SBUF);//将接收到的数据发送给串口
RI = 0; //软件复位
}
}
//Uart.h
#ifndef __UART_H__
#define __UART_H__
void UART_Init();
void UART_SendByte(unsigned char Byte);
#endif
//Uart.c
#include <REGX52.H>
void UART_Init()
{
/**串口寄存器配置**/
SCON = 0x50; //初始化串行口控制寄存器,REN位为1
PCON |= 0x80; //使能波特率倍速位SMOD
/**定时器寄存器配置**/
TMOD &= 0x0f; //这段代表TMOD低四位保持不变,高四位清0
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xf4; //设定定时初值
TH1 = 0xf4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1; //启动所有中断
ES=1; //启动串口中断
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte; //将数据写入串口数据缓存寄存器
while(TI == 0); //等待TI置1,即发送完成前一直等待,TI=1即为发送完成
TI = 0; //发送完成后,需要软件复位
}
二、QT界面
接收框和发送框需要注意一下其他都一样就行
![](https://img-blog.csdnimg.cn/direct/5ac9cf1dc76049d1ab004979a1ee6b07.png)
三、QT配置和代码
![](https://img-blog.csdnimg.cn/direct/8369115f5e8e4aafab3eb74dcc1b2ad7.png)
按钮控件的使用直接右键选择转到槽就很方便
//widget.cpp
//按钮控件的使用直接右键选择转到槽就很方便
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QSerialPortInfo>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QStringList seriaPortNameList;
connect(serialPort,SIGNAL(readyRead()),this,SLOT(on_serialPort_readyRead()));
//自动查找串口
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
seriaPortNameList<<info.portName();
}
ui->comboBox_Serial->addItems(seriaPortNameList);
}
Widget::~Widget()
{
delete ui;
}
//打开串口
void Widget::on_pushButton_Open_clicked()
{
QSerialPort::BaudRate baudRate;
QSerialPort::DataBits dataBits;
QSerialPort::StopBits stopBits;
QSerialPort::Parity checkBits;
if(ui->comboBox_Baudrate->currentText()=="4800")
{
baudRate = QSerialPort::Baud4800;
}else if(ui->comboBox_Baudrate->currentText()=="115200")
{
baudRate = QSerialPort::Baud115200;
}
else if(ui->comboBox_Baudrate->currentText()=="9600")
{
baudRate = QSerialPort::Baud9600;
}
if(ui->comboBox_Data->currentText()=="8")
{
dataBits = QSerialPort::Data8;
}
if(ui->comboBox_Data->currentText()=="5")
{
dataBits = QSerialPort::Data5;
}
if(ui->comboBox_Stop->currentText()=="1")
{
stopBits = QSerialPort::OneStop;
}
if(ui->comboBox_Check->currentText()=="none")
{
checkBits = QSerialPort::NoParity;
}
serialPort->setPortName(ui->comboBox_Serial->currentText());
serialPort->setBaudRate(baudRate);
serialPort->setDataBits(dataBits);
serialPort->setStopBits(stopBits);
serialPort->setParity(checkBits);
if(serialPort->open(QIODevice::ReadWrite)==true)
{
QMessageBox::information(this,"提示","成功");
}else
{
QMessageBox::information(this,"提示","失败");
}
}
//关闭串口
void Widget::on_pushButton_Close_clicked()
{
serialPort->close();
}
//接收数据
void Widget::on_serialPort_readyRead()
{
//用十六进制接收数据
QByteArray recvBuf = serialPort->readAll();
//将十六进制转换为字符串需要显示在界面上
QString recvStr = recvBuf.toHex().toUpper();//.data();
//添加空格,方便查看
QString str2;
for(int i = 0; i<recvStr.length(); i+=2)
{
str2 += recvStr.mid (i,2);
str2 += " ";
}
//字符串小写转换为大写
// str2.toUpper();
// qDebug() << "str2 = 小写转大写=" <<str2 << endl;
//挨着每一行显示数据
ui->plainTextEdit_recve->insertPlainText(str2);
}
//发送数据
void Widget::on_pushButton_Send_clicked()
{
//发送数据获取textEid框内的数据并转换为十六进制发送
QString msg = ui->textEdit_send->toPlainText();
QByteArray hexStr = QByteArray::fromHex(msg.toLatin1());
//通过串口类把数据发送出去
serialPort->write(hexStr);
qDebug() << hexStr <<endl;
}
//清空接收到的数据
void Widget::on_pushButton_clear_clicked()
{
ui->plainTextEdit_recve->clear();
}
四、运行效果
![](https://img-blog.csdnimg.cn/direct/31d75bafdc76406c8f1a2f8a8873cece.png)
![](https://img-blog.csdnimg.cn/direct/d07bd47f2de34935ac48aeb070c7dd6a.png)
![](https://img-blog.csdnimg.cn/direct/e897b661f13f4b21a50ee603d6ea3b4b.png)
![](https://img-blog.csdnimg.cn/direct/1029baddb29b41a0abe8f3839dfbfa7a.jpeg)
![](https://img-blog.csdnimg.cn/direct/105f8fb66de049808b64da94476f03bf.png)
![](https://img-blog.csdnimg.cn/direct/6b277f63afc44553b47092febe01be13.jpeg)
![](https://img-blog.csdnimg.cn/direct/caf4865b9bab46a3bd8cce7fc3995b5a.png)
![](https://img-blog.csdnimg.cn/direct/19b0ee132c96471c8fbe636c994b6473.jpeg)