|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.编辑工程文件(后缀为 .pro 的文件)在 QT += core gui 后添加 serialport。* r8 w1 o5 }: h1 s) `& W3 l1 c, l
![]()
) X$ `7 l2 u! S! f* p& l9 }2.自动获取串口, b* C1 u1 w: I6 T# f0 D
使用 QSerialPortInfo:::availablePorts()获取当前串口,该函数返回容器类 Qlist,用 Qt 定义的关键字 foreach 遍历容器 Qlist 里的串口信息,并将串口信息放到 QStringList 的类对象 serialNamePort,显示到 ui 的串口组件。
7 t( E+ ^2 p8 R: @{+ Y/ q, R: _2 G$ q1 \* |+ X
{
5 s2 d1 ?( B$ B9 T+ ~ui->setupUi(this);/ ^3 y' s+ }. `! B7 h
QStringList serialNamePort;
* u" H2 S& H/ q' X! b. U4 u//遍历:availablePorts()返回的串口信息
% Y0 j9 D' G; I; f- g! H4 [foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){/ S' i6 w4 U0 D5 d" {: C7 r
serialNamePort << info.portName();0 _6 T' h4 D" d' u* k
} C; G- w; T' |+ b: n
ui->serialCb->addItems(serialNamePort);
5 k% ]7 u! }( N( X" N4 K3 g}" `" s0 Z2 |7 m% g8 L: l
编译后点击串口选择框,会出现已经连接的串口。
5 Z- i d0 Q @7 f; ~- Y![]()
9 r- ?# ^: o+ \ O8 \; X" F* f3.打开串口功能和属性设置% l- z+ l5 |7 C q
步骤一:实例化串口类 QSerialPort 对象 serialPort,对串口的操作就是对 serialPort 对象的操作,调用QSerialPort 封装的成员变量(属性)和成员函数(功能)就能控制串口。: D% H w+ ?4 M
class Example : public QMainWindow- P7 x/ b, ^0 A# J
{
% }. T6 @# t, Q/ ^public:! L6 ]. V" ?: p6 W
.......... QSerialPort * serialPort;* [* |5 d8 b# j/ [! b3 ]* C
.......... };
6 ^/ t( A- E$ z0 m; Vui(new Ui::Example)4 N, Z! D% N) p7 w% h# c
{
0 ] E) B/ u3 J+ B9 G9 T% q; iui->setupUi(this);$ n7 B: y R- G& r" v
......+ A$ @+ L2 h3 F* E0 Z, p
serialPort = new QSerialPort;
# X( g- F3 Q3 e* x...... }
* j2 ~; U' [4 p步骤二:填充波特率,数据位,停止位,校验位等属性。获取 ui 组件传递过来的串口信息,将串口属性填充到 serialPort 对象。
3 m; c w0 Q8 a! s8 A( p : p1 M: Y; p$ K- r, L' v
步骤三:打开串口,判断是否打开成功。
" n: u: L! E) ~2 B% l% W* @9 Q/*打开按钮*/
# R' B- ^7 n/ ^; f! Rvoid Example: n_openCb_clicked()- z, P! A7 m; @$ q
{
y0 }/ W0 p2 @' aQSerialPort::BaudRate bauRate; //波特率
e# x9 p( Y; J2 y1 K7 qQSerialPort: ataBits dataBits; //数据位2 @4 z3 B2 G+ ]! q4 z" w, q
QSerialPort::StopBits stopBits; //停止位6 V& U# R0 t/ B1 [* s+ @ t
QSerialPort: arity checkBits; //校验位) P$ E6 h: f- l6 N0 G" k
//设置波特率
; @$ l4 p6 t- Q5 w* Eif (ui->baudCb->currentText() == "4800" ) { bauRate = QSerialPort::Baud4800; }
4 G( V$ G9 l5 h, t4 U H7 felse if(ui->baudCb->currentText() == "9600" ) { bauRate = QSerialPort::Baud9600; }: Q H) l6 |5 J X/ b) D d
else if(ui->baudCb->currentText() == "115200") { bauRate = QSerialPort::Baud115200;}
- O8 x0 {" W! D+ Y& i7 Y//设置数据位
( M- \1 X; a, Dif (ui->dataCb->currentText() == "5") { dataBits = QSerialPort: ata5;}. b E# \, W! M+ v" z0 T
else if(ui->dataCb->currentText() == "6") { dataBits = QSerialPort: ata6;}0 e/ G. ?) T; L
else if(ui->dataCb->currentText() == "7") { dataBits = QSerialPort::Data7;}" x6 I& r0 }# M2 t$ E2 l
else if(ui->dataCb->currentText() == "8") { dataBits = QSerialPort::Data8;} N( I* L* ~( W7 K
//设置停止位
# `# o b) T. } \. h) j2 ?if (ui->stopCb->currentText() == "1" ) { stopBits = QSerialPort::OneStop; }7 `+ |+ w! \- u9 g
else if(ui->stopCb->currentText() == "1.5" ) { stopBits = QSerialPort::OneAndHalfStop; }5 j% Y' u" C- ]2 a, s
else if(ui->stopCb->currentText() == "2" ) { stopBits = QSerialPort::TwoStop; }/ {5 u* }! v0 x
//设置校验位
( U5 _8 ~: q L# {* h/ qif(ui->checkCb->currentText() == "none" ) { checkBits = QSerialPort::NoParity; }
' D" V6 Q; G9 g& N//填充串口对象的属性值
: ~7 Y, L6 [* x4 TserialPort->setPortName(ui->serialCb->currentText());
* B$ r' @: h/ z; v, u' VserialPort->setBaudRate(bauRate);
! ~8 a% S) J( D3 e, n0 O. yserialPort->setDataBits(dataBits);
2 ~" w' b- K- d1 R/ ?& U0 m, DserialPort->setStopBits(stopBits);8 H( ^2 o& K! {& i, X M {( ?
serialPort->setParity(checkBits);1 f- M; k+ ]; ?. W0 F
//设置好属性后打开串口4 h$ w! D- A9 ?1 `% e0 [: ?
if(serialPort->open(QIODevice::ReadWrite) == true){2 j9 [8 r4 R/ l3 @1 E* r
QMessageBox::information(this,"提示","成功");
4 ^1 l- r; [' ^6 A+ O}else{
) \, Z9 C, G0 wQMessageBox::critical(this,"提示","失败");
6 }3 ~" Z2 g& T! @: t}+ h; u- @$ |3 Y2 G4 W
}! `# j' s( Z/ R
4.收发串口数据功能
5 c, u! c' | }9 m$ q3 \读数据:每当数据流从串口到达系统一次,就会传到 Qt 应用程序一次,readyRead 信号就会触 发 一次,所以可以用前面章节讲的信号和槽机制将 readyRead 信号和槽函数绑定,然后就可以在槽函数中读取串口数据。槽函数中使用 readAll()读取数据,使用带换行功能的 appendPlainText()显示到 ui 的接收窗口。) E& y4 Y8 e* F, |% V
//类中声明槽函数7 L1 D8 _' e3 K0 O+ J
private slots:/ I! a y. g1 H$ E# N! t; B
void serialPortReadyRead_Solt(void);
, G! d! F3 E: S; M1 M, C0 f5 J! F//readyRead 信号和槽函数绑定9 r( \" O0 \* v2 H, ^9 ^1 V# w
connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Solt()));/ A8 [ [" y. ^
//读串口$ c3 y; L j+ Y, u* y; _
void Example::serialPortReadyRead_Solt(void)- g0 x" }& k1 q5 P# ?
{
' |/ Q% n! r% Q/ c2 |QString buf;
3 h& s# S D3 k. ^& K Nbuf = QString(serilaPort->readAll());# S+ M3 i. J' i" n
ui->recvEdit->appendPlainText(buf);' `9 w$ H. |( n: O
}
6 z# D/ F" j( I7 }& N8 V ]写数据:获取 ui 界面填写的信息,ui->sendEdit->text(),使用 QSerialPort 的成员函数 write 将数据写到! f2 f+ {3 e: W+ o: L6 ~) w
串口。1 e& d$ ~# w9 B, N. b: V2 o' h
void Widget: n_sendBt_clicked()1 n, b/ |( a8 |! @
{
/ o6 `7 u. J1 aserilaPort->write(ui->sendEdit->text().toLocal8Bit().data());
; |2 Z5 {9 o% b}4 y; y7 m% _ |* u6 k* S! p3 H" U8 i0 z
5.关闭串口功能0 C& l l# P3 ~& C5 z1 L
使用 QSerialPort 的成员函数 close()关闭串口。
2 {; _3 T& H e- @; D0 y3 mvoid Widget: n_closeBt_clicked()# u k) ]) m. Q7 }! S
{
* y0 j4 a0 i' S' ~serilaPort->close();# d1 m/ H1 B% Q. d
}
' i$ c" W/ j: t1 K6.清空发送栏数据5 a9 b+ i6 }+ X3 l% h
调用 ui 组件 lineEdit 的成员函数 clear 即可清空数据。
& }0 u" m' v$ u( ^2 e$ T+ ~& tvoid Widget::on_clearBt_clicked()
( t( c6 @. s; _8 T% ^; ]{
. ~" Y8 f; d, Bui->recvEdit->clear();* V* f; l1 Q# f: c4 K
}
9 u& M; H, I8 e7 E" f) c编译测试,结果如图:
: M" q( I" d b$ i8 ~( d( S( ^![]()
# Y/ T+ q* _. i/ f( Y+ u0 h![]()
. W: U. u% q2 i9 B& g |
|