找回密码
 注册
关于网站域名变更的通知
查看: 510|回复: 1
打印 上一主题 下一主题

itop4412开发板Qt串口编程-实现串口功能

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-15 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1.编辑工程文件(后缀为 .pro 的文件)在 QT += core gui 后添加 serialport。% H+ o1 q! ^$ v3 p2 E
/ N. [, G+ y( c9 m' t: a
2.自动获取串口
7 q4 d8 u* v/ j/ n2 }使用 QSerialPortInfo:::availablePorts()获取当前串口,该函数返回容器类 Qlist,用 Qt 定义的关键字 foreach 遍历容器 Qlist 里的串口信息,并将串口信息放到 QStringList 的类对象 serialNamePort,显示到 ui 的串口组件。% ^2 t$ H  }! V9 f0 h
{4 m0 n9 Z' A0 E. D! p6 S
{6 {* J/ w+ ?* o! C5 n! o/ n
ui->setupUi(this);
4 {9 d! h( g9 U) lQStringList serialNamePort;- {7 J: ~4 w7 G' n4 {
//遍历:availablePorts()返回的串口信息% t3 D5 z2 W) l4 i* l7 |' l5 I( R/ [
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){  _0 I9 A) \! m- w) }% }- ]
serialNamePort << info.portName();
6 ?. g+ H/ t1 N& Z}- e$ O% Z4 u; u. R8 m& s, u8 t% f
ui->serialCb->addItems(serialNamePort);0 W, j) W; ~0 D0 R) k3 n. W1 ]
}2 u8 A5 F) E# A# p7 Q; l
编译后点击串口选择框,会出现已经连接的串口。* T4 I6 t/ j( j9 {! `

9 F0 k/ j8 t; n, B& P4 K( u3.打开串口功能和属性设置
( }9 e2 T) R! Z: ~$ l步骤一:实例化串口类 QSerialPort 对象 serialPort,对串口的操作就是对 serialPort 对象的操作,调用QSerialPort 封装的成员变量(属性)和成员函数(功能)就能控制串口。! N7 h1 |# v# a9 ?: K- |
class Example : public QMainWindow
0 z/ s8 u  y1 ?: s- ^0 t. Z( }2 k9 v  s& k{
3 G& d/ t6 I( b) C  [, ypublic:
( |) A; ?# }4 D0 p! @.......... QSerialPort * serialPort;
* B0 b! q2 ?. Y* J9 I2 m.......... };! m7 ~' K- T) k  h
ui(new Ui::Example)
) e+ V: z* R% Y- q/ |{+ m# Z; a" a7 {' D% s; S
ui->setupUi(this);
$ i, a! M  G, V) g+ u' X" L/ a......2 E$ q) k2 P* t$ n3 W$ y, b, `
serialPort = new QSerialPort;2 X7 d- d/ z* E; m, T8 j
...... }! B: w% I2 R' B% t
步骤二:填充波特率,数据位,停止位,校验位等属性。获取 ui 组件传递过来的串口信息,将串口属性填充到 serialPort 对象。
$ ?" z- S, @7 c  ~0 |
" W( M& q! U' K- C7 Y8 X& b  G5 c步骤三:打开串口,判断是否打开成功。
8 H- L! Y) L5 d* v: u/*打开按钮*/! o0 V( P9 n: C- r
void Example:n_openCb_clicked()9 P% B+ W, @7 F; u6 E/ b
{
. @1 e9 D1 w* q2 Y2 ?8 WQSerialPort::BaudRate bauRate; //波特率
; ~* T. I% f$ E; pQSerialPort:ataBits dataBits; //数据位* p. n6 A* G4 X: B9 f' j1 d
QSerialPort::StopBits stopBits; //停止位
5 r) }/ E8 J& g! D- E+ }QSerialPort:arity checkBits; //校验位0 {( C! M% e5 F6 z8 y
//设置波特率* f$ i  \: L2 F0 M
if (ui->baudCb->currentText() == "4800" ) { bauRate = QSerialPort::Baud4800; }" N2 h4 m  z0 G
else if(ui->baudCb->currentText() == "9600" ) { bauRate = QSerialPort::Baud9600; }
3 F: b! s! [, O, d9 |else if(ui->baudCb->currentText() == "115200") { bauRate = QSerialPort::Baud115200;}& B4 {# b4 c/ L
//设置数据位
7 @6 \; o* }) b$ }$ P: w' l4 }/ iif (ui->dataCb->currentText() == "5") { dataBits = QSerialPort:ata5;}  e6 j$ b5 s6 Z
else if(ui->dataCb->currentText() == "6") { dataBits = QSerialPort:ata6;}
  K- \6 Y2 X- M* ]7 eelse if(ui->dataCb->currentText() == "7") { dataBits = QSerialPort::Data7;}$ G% _2 G2 H3 F( n
else if(ui->dataCb->currentText() == "8") { dataBits = QSerialPort::Data8;}0 R- {/ ^& }# f! B
//设置停止位$ P) H$ t; ?- E! F
if (ui->stopCb->currentText() == "1" ) { stopBits = QSerialPort::OneStop; }8 I! K/ G  \" E- u; i& M
else if(ui->stopCb->currentText() == "1.5" ) { stopBits = QSerialPort::OneAndHalfStop; }
2 r- i# C# ^: C* Jelse if(ui->stopCb->currentText() == "2" ) { stopBits = QSerialPort::TwoStop; }
. k- f" [. f* L6 D2 ~0 Z//设置校验位
4 I  a1 t9 v- v" }" n9 vif(ui->checkCb->currentText() == "none" ) { checkBits = QSerialPort::NoParity; }
0 ?# V5 h7 Y  _//填充串口对象的属性值
% p" c  v, [8 SserialPort->setPortName(ui->serialCb->currentText());& ~! y3 ]* U  D  G% A1 R0 _3 y7 g
serialPort->setBaudRate(bauRate);2 s) I& |- u1 U: ?
serialPort->setDataBits(dataBits);
/ W! e1 m) ]6 PserialPort->setStopBits(stopBits);( t2 Y$ v3 ?0 z9 x9 ^# ~
serialPort->setParity(checkBits);: R# J- i3 g  W. v; q: b
//设置好属性后打开串口6 R& S0 V! q! b! ?  N8 Z( j
if(serialPort->open(QIODevice::ReadWrite) == true){) v, ]5 Y6 H# \+ u& U  a/ l& C5 e
QMessageBox::information(this,"提示","成功");
7 @) K6 W4 M  B6 w, h6 d2 U}else{
$ S* ^5 r; F) e' D( `QMessageBox::critical(this,"提示","失败");; X3 F/ ?" U$ s1 U" n7 o- {4 x
}
4 ~1 n; J( l' K* H/ p}3 I& X( `: |$ y5 t
4.收发串口数据功能' N1 L+ b" W. P( S6 O+ {$ H! x
读数据:每当数据流从串口到达系统一次,就会传到 Qt 应用程序一次,readyRead 信号就会触 发 一次,所以可以用前面章节讲的信号和槽机制将 readyRead 信号和槽函数绑定,然后就可以在槽函数中读取串口数据。槽函数中使用 readAll()读取数据,使用带换行功能的 appendPlainText()显示到 ui 的接收窗口。% M+ w3 X/ k- c; Z- b. l7 u
//类中声明槽函数
& L- d! Q2 k6 c6 w5 dprivate slots:3 p! E  ?- h4 \3 g3 V" c8 _
void serialPortReadyRead_Solt(void);0 g3 o$ k6 }0 a$ Q( L" `* e% ]1 N
//readyRead 信号和槽函数绑定
, D& j1 |$ P" O  q; cconnect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Solt()));2 D5 g# f* s  A+ {1 o1 [
//读串口
  ~! U' o. X* m' M0 j  c& _6 H) rvoid Example::serialPortReadyRead_Solt(void)
: z7 {+ ], E5 |. M{; m; p) a. [& a0 a* ^+ D
QString buf;5 @* W/ V/ ]: q% j. p9 _+ |
buf = QString(serilaPort->readAll());7 `; P% l% ^; }7 ^4 E5 {, A9 T. z/ J
ui->recvEdit->appendPlainText(buf);# A6 B+ u" y- Q. [- u
}2 D& N7 N) u( d. n' B, `( @
写数据:获取 ui 界面填写的信息,ui->sendEdit->text(),使用 QSerialPort 的成员函数 write 将数据写到/ X. W# }( u, f3 W& U: I! P' n3 k
串口。
- i) V7 \, ], lvoid Widget:n_sendBt_clicked(), k" M4 z- Q7 x  ]
{* l  d8 [9 Q: S' Q3 M' e  u
serilaPort->write(ui->sendEdit->text().toLocal8Bit().data());6 S; f  c) m5 `
}6 g% O. R4 p5 `0 N
5.关闭串口功能
; A0 W2 i1 d; V使用 QSerialPort 的成员函数 close()关闭串口。/ w& |& _2 [, I
void Widget:n_closeBt_clicked()
' V/ a# U- m  ~/ u- H5 c& c{
6 T6 u* b- M' O9 z% f( _! J( p1 y* D' @serilaPort->close();% d! T- P6 N, ~! _- K6 ^( w, u; X
}
7 t& O8 b5 e; h) s, [4 K% B( i6.清空发送栏数据& j/ P2 l( u3 e
调用 ui 组件 lineEdit 的成员函数 clear 即可清空数据。& V# @7 ~- c" Z; T% Z1 v
void Widget::on_clearBt_clicked()& o3 u" V* ]4 k: K: W  d. G% y( s
{0 W8 H7 y2 O" P7 L
ui->recvEdit->clear();
% j  h' ]: K! ]2 W}
; D0 m$ k# O, x2 {" @编译测试,结果如图:4 |1 N% l' t8 {9 J4 P8 {
9 M( K; [; ^" V9 Z" ~, G
/ c+ q2 D. J  F5 m8 ~" f3 y

该用户从未签到

2#
发表于 2021-4-15 13:15 | 只看该作者
itop4412开发板Qt串口编程-实现串口功能,很好的分享,收藏了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 14:05 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表