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

迅为4412开发板Qt下控制硬件

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-3-25 14:33 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

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

x
我们在 QT 上要怎么操作驱动呢?比如,我们要点亮一个 led 灯,我们在 C 语言中可以使用 open,read,write,ioctl 函数来进行操作,但是 QT 上我们使用的语言是 C++,那我们要怎么来操作驱动呢?
4 S& j3 M4 D# f- r我们可以使用 C 和 C++进行混合编程,我们先来看一个控制蜂鸣器的 APP 代码,这里以终结者 I.MX6ULL为例,iTOP-4412 可参考测例程代码,代码如下:& x( v1 l7 s. S
#include "stdio.h" #include "unistd.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "stdlib.h" #include "string.h" #define BEEPOFF 0* q4 V" Z; O0 O* c, |3 m2 a9 S' ~
#define BEEPON 1
0 l# `7 a% J: r/*
% V) t% ^2 B+ K+ X. B* @description : main 主程序2 L/ g" w: d% Y
* @param - argc : argv 数组元素个数
8 r' Y: G! H8 [# ?4 S* @param - argv : 具体参数
3 f# t' g" p6 A8 w( f* @return : 0 成功;其他 失败# s8 \! F/ A$ p, h; y
*/* C% A/ k6 K( S- l, B
int main(int argc, char *argv[])2 F7 `" v+ F0 A9 d7 b+ \
{
" G9 a7 A2 x2 L" E& y* ]int fd, retvalue;1 z5 j* n$ v9 e  x  h; u
char *filename;
7 m) A; X( W2 H3 p) Dunsigned char databuf[1];
% A' b% z' E4 Q; {( W4 xif(argc != 3){
, ?3 w; h5 R* xprintf("Error Usage!\r\n");) o3 B( [2 F  T
return -1;: O: W) E- x& ?6 W
}
8 d& S3 b3 h8 `6 Y! ffilename = argv[1];
0 x4 f  k5 Q* v; j* A/* 打开 beep 驱动 */
- g9 G6 z8 P5 pfd = open(filename, O_RDWR);
* b7 V& N: H0 D, {, cif(fd < 0){
* |% s' u4 J$ }5 |) _/ xprintf("file %s open failed!\r\n", argv[1]);
/ G1 V+ i- }. i8 b( jreturn -1;' L* S! S& o4 D
}
% I- T7 h- ?2 ~2 N" K' Ydatabuf[0] = atoi(argv[2]); /* 要执行的操作:打开或关闭 */
/ G( ]' K" F4 K! t( Z/* 向/dev/beep 文件写入数据 */$ d+ F2 @. f. ]3 M9 S1 S
retvalue = write(fd, databuf, sizeof(databuf));
- ]/ M) M, M4 \7 P4 [! {/ Tif(retvalue < 0){
  N, d6 E8 l4 ^: H7 ]9 S2 }printf("BEEP Control Failed!\r\n");$ t! q) d$ E# x! Q0 J" H
close(fd);
/ v' w& W& r/ o# t5 wreturn -1;: Z3 Y" e" C* p
}
2 X) }" ^6 Q+ Z! v- Hretvalue = close(fd); /* 关闭文件 */% K& r8 i* M$ k
if(retvalue < 0){
/ I7 e6 @# W5 aprintf("file %s close failed!\r\n", argv[1]);
0 U4 U; X& j6 ~- treturn -1;
4 W. p5 ]- O8 i$ }* w8 a* y}
' V2 {4 w) F" X; Creturn 0;
! u: W$ L/ U$ L7 M9 s}
4 ~8 Y$ r3 {9 Z: C# ?! J& E' [通过上面的代码我们可以发现,使用 C 语言来控制一个蜂鸣器,无非就是打开设备节点,然后通过 write来写入数据就可以控制蜂鸣器了。既然我们可以使用 C 和 C++混合编程,那么我们是不是只需要把这个 C控制蜂鸣器的代码直接加到 QT 程序里面就可以了,那我们我们要怎么进行混合编程呢?7 R  O# L8 j( Q  y  R! G
我们先新建一个 QT 工程,然后添加俩个按钮来控制蜂鸣器的打开和关闭,UI 界面如图 62.4.1:& @" I2 C( k1 u7 d+ Y

8 H+ ~" |2 m+ e/ y: v然后我们开始移植代码,因为 C++是面向对象的,C 是面向过程的,所以在 QT 上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把 C 语音控制蜂鸣器的代码封装成一个类。* l4 w3 f8 H  e( s6 q' U. r" ]  [
我们右键选中这个工程,然后选择添加新文件,添加 C++ Class 如图 62.4.2:( O: l! R8 u6 Q& ~' x* b4 W* }  b' U

# ~' M- \$ l; _) M然后我们添加类的名字,因为我们操作的是蜂鸣器,所以我们这里写成 Beep,如图 62.4.3:. z+ B; M9 z" M: o( s+ H
) z4 S4 P. X4 d& x& `
第一步,我们把 C 语言控制蜂鸣器代码的头文件,添加到我们刚才添加 Beep 类生成的文件 beep.h 里面,但是头文件我们不能直接复制过去,我们要用 extern “C”{}括起来,代码如下:
9 h. n" H7 o7 W: d# b2 L: ~) cextern "C"{0 H4 _# u7 ~5 \# u" S
#include "stdio.h" #include "unistd.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "stdlib.h" #include "string.h" }
6 g! @& ]) A" w$ H; L( h添加完成如图 62.4.4 所示:+ I+ e: j& p# T/ [
1 a6 N0 v: ~! R, u$ l
图 62.4.4
, e, I5 ~, ~. l- t  A3 C6 C! X第二步,把我们 C 语言控制蜂鸣器里面的参数定义复制到 public 下面,代码如下:) ?% G; `( H4 X  G
int fd, retvalue;
' Z$ c8 ]; ?+ J1 bchar *filename;+ F) C1 O" H* [2 o( P
unsigned char databuf[1];0 A1 o! P% A  n" }) Z
添加完如图 62.4.5 所示:# a2 [5 N7 z8 X) Y: V

; o$ d* w2 q: S* p) {6 |然后我们打开 beep.cpp,把 C 语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面,注意,QT 里面我们不能使用 printf,代码如下:
1 q6 W" D1 @5 a* Z5 T' K9 y- ~/* 打开 beep 驱动 */
# ~. R3 [! b: l1 `, t! Gfd = open(filename, O_RDWR);
$ O: h( n% c, n% Nif(fd < 0){  X6 t1 v* K3 R
return ;
/ g$ X5 f3 @2 m+ x0 s0 p( P}3 b. C! S  B. K: E8 e" l7 N& ~& ?; z
添加完如图 62.4.6 所示:
! J3 I4 y" j* E1 p
: X$ y4 m8 T5 t6 m8 Z" Q图 62.4.6
' i" [& e+ e( ^3 l; m1 a8 E$ Y4 f然后我们创建一个打开蜂鸣器和一个关闭蜂鸣器的函数,第一步,现在 beep.h 里面声明,然后在( _" E; r! i9 _- Z
beep.cpp 里面实现。
4 r* y4 ?5 |+ |6 z( H声明:
; E1 J* m' J$ V; o9 Z: y2 ?代码如下:
6 d3 X* j1 `4 h5 j( b4 Zvoid Beep_On();- i* }* M* u- Y3 U2 }: C
void Beep_Off();
( \$ P; b7 W* b# M: e添加完如图 62.4.7 所示:
& t! T- [7 P5 J# k- @8 L
+ ~2 W+ k% B  F, v7 V/ e4 g图 62.4.7
# J1 h1 u5 a& I9 v6 O7 @实现:# [& Y- C6 n4 ~. o' M8 e; i5 Y" r8 w. r
代码如下,注意 c 语言函数前面要加::,表示这个函数是 C 函数。! \! M' e( N, H( K8 x) h. Y
void Beep::Beep_On()1 w2 d" t* z( B5 m2 Q$ ]
{
6 b, w: N- k, W' a- P# h/* 向/dev/beep 文件写入数据 */: m. |& G: b4 V! ^! M2 w
databuf[0] = 1;0 o' \# _! @: D0 F! H4 k: n& i" z+ [7 \
retvalue = ::write(fd, databuf, sizeof(databuf));
- |) e8 W/ Z, Y* Eif(retvalue < 0){
# S- D: f3 o8 c2 Y2 S5 U::close(fd);: }+ L- D0 I. J# A& l& X, \
return ;
3 v$ C! Q% z$ h}" p5 z+ c! j' ^% Z
}
4 Z0 c7 s- K+ i" @3 W; a; Jvoid Beep::Beep_Off()
: T% W# O. }, g{
  ?- z/ [! W% y8 R" ^databuf[0] = 0;# W( h# @) C2 r7 g4 @1 ~
retvalue = ::write(fd, databuf, sizeof(databuf));
6 a* l& j$ q  o- m8 e7 P7 O# Oif(retvalue < 0){4 g) \/ ~, H' a: m$ |; k
::close(fd);
1 l$ P  h1 D' k$ ^; \return ;- m8 j) _/ Q+ |8 c; j" D
}$ x: w8 `6 W7 g% }" E3 o
}" I' O) [2 t( Q2 l
添加完如图 62.4.8 所示:
" f% A  }5 R, \8 P, s9 K! L
- N4 u3 j3 D3 M4 o; M8 }+ ~9 Q: o- ^图 62.4.8
' }/ e3 c8 }' q7 @: V) t" j添加好了之后,我们直接使用这个类就可以了,我们先在 widget 里面新建一个 beep,
# N  w. r- q5 A# N& Z然后我们在构造函数里面新建一个对象,如图 62.4.9 所示:
3 T4 Q& A0 @: F) r8 E+ G& x7 `3 x) X7 g$ S3 U
图 62.4.99 K8 r) d5 K, i* _5 ~8 ?' l
然后我们在槽函数里面执行对应的打开和关闭动作即可,如图 62.4.10 所示:" j1 v" Q! n. j, {0 T* S4 M/ o
; y' y8 p% M  j$ B) P# O

0 u8 F0 O: n9 N

该用户从未签到

2#
发表于 2021-3-31 09:39 | 只看该作者
                                                   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 13:30 , Processed in 0.171875 second(s), 24 queries , Gzip On.

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

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

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