0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

QT串口通信的簡單使用

玩轉(zhuǎn)單片機(jī) ? 來源:玩轉(zhuǎn)單片機(jī) ? 2024-01-15 09:27 ? 次閱讀

QT串口通信上位機(jī)和下位機(jī)通信常用的通信方式,也是學(xué)習(xí)QT必須學(xué)會的基礎(chǔ)知識, 這篇就簡單介紹一下QT串口通信的簡單使用.

| 創(chuàng)建項目

1: 創(chuàng)建新項目

dbbe5b88-b2bb-11ee-8b88-92fbcf53809c.png

2: 配置相關(guān)信息

dbdb6e4e-b2bb-11ee-8b88-92fbcf53809c.png

dbe5f346-b2bb-11ee-8b88-92fbcf53809c.png

dc0a21f8-b2bb-11ee-8b88-92fbcf53809c.png

dc1d1aec-b2bb-11ee-8b88-92fbcf53809c.png

3: 設(shè)計界面

dc307b46-b2bb-11ee-8b88-92fbcf53809c.png

dc4b6316-b2bb-11ee-8b88-92fbcf53809c.png

4:編寫代碼

目的: 通過簡單實驗驗證串口通信.

4.1: 配置項目

dc607878-b2bb-11ee-8b88-92fbcf53809c.png

4.2: 編寫上位機(jī)代碼

widget.h文件

#ifndefWIDGET_H
#defineWIDGET_H

#include
//引入頭文件
#include
#include

namespaceUi{
classWidget;
}

classWidget:publicQWidget
{
Q_OBJECT

public:
explicitWidget(QWidget*parent=0);
~Widget();

//定義曹函數(shù)
privateslots:
voidon_pushButton_clicked();
voidreceiveInfo();
voidsendInfo();

private:
Ui::Widget*ui;
//串口對象指針
QSerialPort*m_serialPort;
};

#endif//WIDGET_H

widget.cpp文件

#include"widget.h"
#include"ui_widget.h"

//調(diào)試輸出頭文件
#include

Widget::Widget(QWidget*parent):
QWidget(parent),
ui(newUi::Widget)
{
ui->setupUi(this);

//實例化一個串口對象
m_serialPort=newQSerialPort();

//獲取可用的串口號
foreach(constQSerialPortInfoinfo,QSerialPortInfo::availablePorts())
{
qDebug()<comboBox->addItem(info.portName());
}
}

Widget::~Widget()
{
deleteui;
}

//pushButton點擊觸發(fā)的槽函數(shù)
voidWidget::on_pushButton_clicked()
{
if(m_serialPort->isOpen())//如果串口已經(jīng)打開了先給他關(guān)閉了
{
m_serialPort->clear();
m_serialPort->close();
}

m_serialPort->setPortName(ui->comboBox->currentText());//當(dāng)前選擇的串口名字

if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite的模式嘗試打開串口
{
qDebug()<<"打開失敗!";
????????return;
????}
????qDebug()<<"串口打開成功!";

????m_serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);//設(shè)置波特率和讀寫方向
m_serialPort->setDataBits(QSerialPort::Data8);//數(shù)據(jù)位為8位
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//無流控制
m_serialPort->setParity(QSerialPort::NoParity);//無校驗位
m_serialPort->setStopBits(QSerialPort::OneStop);//一位停止位

//手動綁定槽函數(shù)
connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(sendInfo()));
}

//接收到單片機(jī)發(fā)送的數(shù)據(jù)進(jìn)行解析
voidWidget::receiveInfo()
{
qDebug()<<"接收";
????QByteArray?info?=?m_serialPort->readAll();

qDebug()<<"receive?info:"<write("0x55");
m_serialPort->write("0xaa");
}

4.3: 編寫下位機(jī)代碼

main.c文件

#include"stm32f10x.h"
#include"stdio.h"

voidled_init(void);
voidusart_init(uint32_tbound);

intmain(void)
{
uint32_ti=0;
led_init();
usart_init(115200);
printf("ok
");
while(1)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
for(i=0;i

| 驗證效果

把下位機(jī)代碼下到開發(fā)板, 然后運(yùn)行自己編寫的上位機(jī), 點擊上位機(jī)發(fā)送數(shù)據(jù), 下位機(jī)就會把收到的數(shù)據(jù)返回到上位機(jī), 可以通過控制臺查看接收到的數(shù)據(jù);

dc7a3fa6-b2bb-11ee-8b88-92fbcf53809c.png

| 簡單shell

main.c文件

#include"stm32f10x.h"
#include"stdio.h"
#include"string.h"

#defineCMD_MAX_LEN16//定義最大命令長度
charcmd_buf[CMD_MAX_LEN];//定義命令緩沖區(qū)
uint8_tcmd_len=0;//定義命令長度
uint8_tcmd_flag=0;//定義命令接收完成標(biāo)志

voidled_init(void);
voidusart_init(uint32_tbound);
voiduser_shell_irq(void);

intmain(void)
{
led_init();
usart_init(115200);
printf("ok
");
while(1)
{
if(cmd_flag)
{
//匹配指令
if(strcmp(cmd_buf,"ledon")==0)
{
printf("ledon");
}
//清理緩存
cmd_len=0;//清零命令長度
memset(cmd_buf,0,CMD_MAX_LEN);//清空命令緩沖區(qū)
cmd_flag=0;//清除命令接收完成標(biāo)志
}
}
}

voidled_init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//定義結(jié)構(gòu)體變量

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//選擇你要設(shè)置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//設(shè)置推挽輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置傳輸速率
GPIO_Init(GPIOE,&GPIO_InitStructure);/*初始化GPIO*/

GPIO_SetBits(GPIOE,GPIO_Pin_5);//將LED端口拉高,熄滅所有LED
}

voidusart_init(uint32_tbound)
{
//GPIO端口設(shè)置
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

/*配置GPIO的模式和IO口*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX//串口輸出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出
GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化串口輸入IO*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX//串口輸入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//模擬輸入
GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化GPIO*/

//USART1初始化設(shè)置
USART_InitStructure.USART_BaudRate=bound;//波特率設(shè)置
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits=USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity=USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發(fā)模式
USART_Init(USART1,&USART_InitStructure);//初始化串口1

USART_Cmd(USART1,ENABLE);//使能串口1

USART_ClearFlag(USART1,USART_FLAG_TC);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟相關(guān)中斷

//Usart1NVIC配置
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口1中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);//根據(jù)指定的參數(shù)初始化VIC寄存器
}

intfputc(intch,FILE*f)//printf重定向函數(shù)
{
USART_SendData(USART1,(uint8_t)ch);//發(fā)送一字節(jié)數(shù)據(jù)
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待發(fā)送完成
returnch;
}

voidUSART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
//shell
user_shell_irq();
}
}

//獲取
voiduser_shell_irq(void)
{
uint8_ttemp=USART_ReceiveData(USART1);
if(temp=='
'||temp=='
')
{
cmd_buf[cmd_len]='?';
cmd_flag=1;
}
else
{
cmd_buf[cmd_len++]=temp;
if(cmd_len>=CMD_MAX_LEN)
{
//清理緩存
cmd_len=0;
memset(cmd_buf,0,CMD_MAX_LEN);
}
}
}

驗證:

dc964d36-b2bb-11ee-8b88-92fbcf53809c.png

簡單介紹了QT的串口如何與下位機(jī)通信, 同時也簡單通過shell交互, 進(jìn)一步拓展了串口通信場景.

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1626

    瀏覽量

    55526
  • 上位機(jī)
    +關(guān)注

    關(guān)注

    27

    文章

    942

    瀏覽量

    54810
  • Qt
    Qt
    +關(guān)注

    關(guān)注

    1

    文章

    302

    瀏覽量

    37917
  • 下位機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    18757

原文標(biāo)題:QT|串口通信

文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于QT串口調(diào)試工具設(shè)計

    串口通信是我們經(jīng)常會遇到的問題。很多時候當(dāng)我們設(shè)計一個串口應(yīng)用時,我們希望有一個簡便的、可視的方式來驗證它。這一篇中我們就來基于QT設(shè)計一個串口
    的頭像 發(fā)表于 12-13 14:37 ?2285次閱讀
    基于<b class='flag-5'>QT</b>的<b class='flag-5'>串口</b>調(diào)試工具設(shè)計

    QT串口通信的相關(guān)資料推薦

    QT通信-串口通信前言一、串口搜索二、打開串口二、發(fā)送或接收數(shù)據(jù)二、程序如下:總結(jié)前言
    發(fā)表于 01-11 07:56

    QT串口程序的編寫

    QT串口程序的編寫前言:如果用qt寫程序作為上位機(jī),然后通過和u***和下位機(jī)通信的時候,就需要用到qt中的
    發(fā)表于 01-18 06:08

    Qt串口通信專題教程

    這是一個關(guān)于在Qt Creator下進(jìn)行串口通信軟件開發(fā)的專題教程,能夠幫助你快速的開發(fā)有關(guān)的串口應(yīng)用。
    發(fā)表于 05-04 14:37 ?24次下載

    基于Qt串口通信應(yīng)用研究與實現(xiàn)嚴(yán)賢

    基于Qt串口通信應(yīng)用研究與實現(xiàn)_嚴(yán)賢
    發(fā)表于 03-17 08:00 ?3次下載

    利用QT 串口通信進(jìn)行RS232協(xié)議開發(fā)

    QT串口通信協(xié)議代碼最近在研究用串口通信去發(fā)送協(xié)議指令控制相機(jī)工作,因為是第一次接觸串口,期間也
    發(fā)表于 01-14 10:05 ?3次下載
    利用<b class='flag-5'>QT</b> <b class='flag-5'>串口</b><b class='flag-5'>通信</b>進(jìn)行RS232協(xié)議開發(fā)

    基于Qt實現(xiàn)的串口示波器

    摘要:逛github時看到這個QT串口示波器,完全開源,支持串口、TCP、波形顯示、通信協(xié)議。感覺很不錯,跟以前分享的那個vofa+有點像。感興趣的可以下載下來學(xué)習(xí)學(xué)習(xí)。
    的頭像 發(fā)表于 06-12 15:34 ?3766次閱讀

    基于QT串口小助手開發(fā)

    QT開發(fā)一個串口小助手,要求能實現(xiàn)串口接收,發(fā)送等基本功能。
    的頭像 發(fā)表于 04-04 15:07 ?2168次閱讀
    基于<b class='flag-5'>QT</b>的<b class='flag-5'>串口</b>小助手開發(fā)

    QT與三菱PLC串口通信

    最近兩天在學(xué)習(xí)QT與三菱PLC串口通信,特此記錄下來。 通信格式 我這里使用RS-232C連接的,根據(jù)FX編程口協(xié)議! 設(shè)置參數(shù),以讀寫的方式打開
    發(fā)表于 04-17 16:08 ?0次下載
    <b class='flag-5'>QT</b>與三菱PLC<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    Qt實現(xiàn)串口通信

    要實現(xiàn)串口通信,需要知道串口通信需要的信息
    的頭像 發(fā)表于 04-23 17:34 ?3990次閱讀
    <b class='flag-5'>Qt</b>實現(xiàn)<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    基于QT簡單的上位機(jī)

    。同樣的,我們也從編寫一個簡單的基于QT的上位機(jī)來體會體會上位機(jī)開發(fā)及認(rèn)識認(rèn)識QT。我們本次實現(xiàn)的上位機(jī)的功能很簡單:上位機(jī)通過串口來控制開
    發(fā)表于 05-08 10:57 ?16次下載
    基于<b class='flag-5'>QT</b>的<b class='flag-5'>簡單</b>的上位機(jī)

    QTQT上位機(jī)串口編程

    QTQT上位機(jī)串口編程 最近因為項目需要,需要用到上位機(jī),通過串口與上位機(jī)進(jìn)行通訊,來上傳和下發(fā)一些數(shù)據(jù)以及控制指令,所以用QT寫了一
    發(fā)表于 05-08 10:02 ?25次下載
    <b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b>上位機(jī)<b class='flag-5'>串口</b>編程

    QT實現(xiàn)簡單的上位機(jī)軟件

    最近項目要求寫上位機(jī)軟件,需要實現(xiàn)界面功能和串口讀寫。界面方面用過MFC(早忘記了),網(wǎng)上查閱資料后發(fā)現(xiàn)QT在5.1版本后有自帶的串口模塊,而且用QT實現(xiàn)
    發(fā)表于 05-08 09:54 ?4次下載
    <b class='flag-5'>QT</b>實現(xiàn)<b class='flag-5'>簡單</b>的上位機(jī)軟件

    Qt5實現(xiàn)上位機(jī)與串口通信

    Qt助手內(nèi)搜索:Qt Serial Port為串口的相關(guān)函數(shù)? 1.添加串口頭文件: # include //使用串口功能# inc
    發(fā)表于 05-10 10:46 ?0次下載
    <b class='flag-5'>Qt</b>5實現(xiàn)上位機(jī)與<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    STM32單片機(jī)如何處理QT上位機(jī)串口中發(fā)過來的數(shù)據(jù)?

    數(shù)據(jù)傳輸?shù)?b class='flag-5'>通信方式。串口通信是一種簡單、穩(wěn)定、可靠的通信方式,其原理是通過串口發(fā)送端口將數(shù)據(jù)轉(zhuǎn)換
    的頭像 發(fā)表于 09-14 14:22 ?3228次閱讀