PC端Qt通过QSerialPort |
您所在的位置:网站首页 › 数码设备图片 › PC端Qt通过QSerialPort |
文章目录
1 前言2 效果3 核心代码3.1 PC端3.1.1 USB转RS232串口线3.1.2 Qt上位机软件
3.2 单片机开发板端3.2.1 开发环境3.2.2 main.c代码
4 代码下载
1 前言
最近有项目需求要做PC端Qt与某嵌入式设备的通信的任务,初步确定需要通过一根USB转RS232串口线与该嵌入式设备连接,在PC端任意输入0~255,这256个十进制数字,在该嵌入式设备上也能显示相应的数字内容。 本篇博客主要记录一下相关操作的实现过程。 涉及到带RS232接口的嵌入式设备,我这边用了一个很久之前买的STC89C52单片机开发板做模拟。 主要思路: (1)硬件:PC机,USB转RS232串口线,STC89C52单片机开发板; (2)软件:PC端通过Qt的serialport模块相关操作,单片机端通过keil uversion5进行51C语言编程、STC-ISP烧写软件实现软件烧写编程; 2 效果PC端的Widget界面内有个QlineEdit输入窗口,可以修改输入数据,输入数据为0~255共256个数据,按回车键后,单片机开发版上的Led数码管显示相应的数据内容。 需要购买一根USB转RS232串口线,下载好相应的串口驱动,通过“计算机”的设备管理器界面的COM端口查看该串口的串口号,可以在此处修改串口号。 我此处为COM8口,此处有个USB-SERIAL CH340(COM7)是用于单片机的烧写,也可做串口通信,需要将Qt上位机的端口号修改,即可实现通信。 通过Qt的serialport模块进行串口通信实现相关功能。 这里面主要逻辑是当lineEdit实例的editingFinished()信号产生的时候,调用send_data()槽函数,对lineEdit内的数据进行采集后传输,需要将lineEdit内的数据转化为QByteArray型的数据,从而通过m_serialPort->write(ba);进行数据传输。 这里的QByteArray数据转化需要稍微注意一下,举个例子,如果需要将QString类型的‘ff’直接转化为QByteArray类型,它QByteArray产生的是一个2字节的数组,即每个字母占一个字节,即QByteArray[0] = f,QByteArray[1] = f,而不是想当然的只占一个字节,不是0xff。 具体怎么转化可以参照代码,代码也是找的网上相关博客里,涉及到十进制如何转化为QByteArray的十六进制存储。代码内容不展开记录了。 widget.cpp #include "widget.h" #include "ui_widget.h" #include Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); m_serialPort = new QSerialPort(); m_serialPort->setPortName("COM8"); m_serialPort->setBaudRate(QSerialPort::Baud9600); m_serialPort->setDataBits(QSerialPort::Data8); m_serialPort->setParity(QSerialPort::NoParity); m_serialPort->setStopBits(QSerialPort::OneStop); m_serialPort->setFlowControl(QSerialPort::NoFlowControl); m_serialPort->setReadBufferSize(40960); m_serialPort->open(QIODevice::ReadWrite); connect(ui->lineEdit, SIGNAL(editingFinished()), this, SLOT(send_data())); } Widget::~Widget() { m_serialPort->clear(); m_serialPort->close(); delete ui; } char ConvertHexChar(char ch) { if((ch >= '0') && (ch = 'A') && (ch = 'a') && (ch s = '0' + s; } qDebug() hstr=str[i].toLatin1(); if(hstr == ' ') { i++; continue; } i++; if(i >= len) break; lstr = str[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; } 3.2 单片机开发板端 3.2.1 开发环境keil uVersion5。 STC-isp 3.2.2 main.c代码通过Qt的serialport模块进行串口通信实现相关功能。 注意点:(1)如果在开发板的RS232串口处如果有选择开关帽,需要将开关帽打开。如下图所示,此时已经打开。 https://download.csdn.net/download/wang_chao118/87545106 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |