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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
我们在 QT 上要怎么操作驱动呢?比如,我们要点亮一个 led 灯,我们在 C 语言中可以使用 open,read,write,ioctl 函数来进行操作,但是 QT 上我们使用的语言是 C++,那我们要怎么来操作驱动呢?6 M8 c" d. K' }3 y
我们可以使用 C 和 C++进行混合编程,我们先来看一个控制蜂鸣器的 APP 代码,这里以终结者 I.MX6ULL为例,iTOP-4412 可参考测例程代码,代码如下:
: P$ Z7 f2 B) G6 p8 d#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+ @; k+ _  W% [& ]3 v  E8 T
#define BEEPON 1
$ t4 j5 G. L. |& C' k4 m9 K# T/*
" ]- s8 D+ a9 N! f% ^* @description : main 主程序$ Z" Q$ h! N, p/ B# L: v  z3 l
* @param - argc : argv 数组元素个数% e  }- `9 Q! C2 C$ w) y4 b8 m( H
* @param - argv : 具体参数
0 a1 w0 z: s3 g+ c* @return : 0 成功;其他 失败
. E/ g; x) g7 O. `3 x/ m*/& G- P$ i( V* d7 c8 I$ p
int main(int argc, char *argv[])  h3 N8 y8 b8 _4 x7 N1 j. q/ y
{7 B+ V: b1 p' K
int fd, retvalue;$ E! P0 X: e, d: }4 B, H" ~  d
char *filename;
6 c5 C: D3 A6 P- t2 T5 O, {unsigned char databuf[1];; G4 A: q: l) I( \
if(argc != 3){
0 O4 ^+ }, ]2 J, }( gprintf("Error Usage!\r\n");9 Q& r8 z* A' ~1 ]. E) B& y
return -1;
  L* M! P3 d! {+ {}
" E6 o, I/ M( @3 p8 h1 Dfilename = argv[1];, w7 ]0 L( C' i9 q6 z. v8 b
/* 打开 beep 驱动 */
4 n7 g6 b; B+ {- b) z0 d- W  l+ sfd = open(filename, O_RDWR);
# p! u. z6 D7 [$ @  hif(fd < 0){
% H- }% g: S/ p3 H. f4 {9 jprintf("file %s open failed!\r\n", argv[1]);9 O) u% U8 O+ c" f% Q8 x8 G' p
return -1;
1 H$ N9 k0 s' u+ ]9 e5 S}& K& s5 ]7 B7 M# ~
databuf[0] = atoi(argv[2]); /* 要执行的操作:打开或关闭 */
& k; ^3 h& y5 z7 s' z  X: J0 @/* 向/dev/beep 文件写入数据 */6 y1 [# K: |6 \8 x7 F
retvalue = write(fd, databuf, sizeof(databuf));
0 j7 S9 N$ H0 ^+ ]( I) K8 {1 W) Xif(retvalue < 0){/ G1 V" J$ [2 a; ~+ a
printf("BEEP Control Failed!\r\n");
3 f- u5 p0 f5 \5 r$ O7 p. qclose(fd);& p; [, y. w, X" C# G1 y1 j: q* h
return -1;
  D# H, E- `3 E# i0 B7 z! f}
# u. @" F8 g4 Dretvalue = close(fd); /* 关闭文件 */
. s% F/ T1 a% z" H- H- nif(retvalue < 0){
9 s  P' ?5 a' P; b: q2 {/ dprintf("file %s close failed!\r\n", argv[1]);
2 M$ k1 _# y9 i& C4 ^return -1;# f+ G. Y) G8 w+ o$ {, m
}
% f8 @# C* v" P- H0 ?return 0;
' V2 d3 A' N& c  t; M+ y7 f) `}
( v( K+ P! `, ?7 r通过上面的代码我们可以发现,使用 C 语言来控制一个蜂鸣器,无非就是打开设备节点,然后通过 write来写入数据就可以控制蜂鸣器了。既然我们可以使用 C 和 C++混合编程,那么我们是不是只需要把这个 C控制蜂鸣器的代码直接加到 QT 程序里面就可以了,那我们我们要怎么进行混合编程呢?
3 n. z. S) |! d# a' @我们先新建一个 QT 工程,然后添加俩个按钮来控制蜂鸣器的打开和关闭,UI 界面如图 62.4.1:
4 K9 V+ G6 N: w6 F! A  H- c1 C
7 u- T9 c$ G; M! V+ Y6 d然后我们开始移植代码,因为 C++是面向对象的,C 是面向过程的,所以在 QT 上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把 C 语音控制蜂鸣器的代码封装成一个类。& v7 Q0 ^6 \' c) s# O0 h0 E7 A
我们右键选中这个工程,然后选择添加新文件,添加 C++ Class 如图 62.4.2:
7 n8 B$ s0 v9 _  D' g+ ?, @% C. X& A6 b8 Z+ j' l3 }4 f0 M. a7 K
然后我们添加类的名字,因为我们操作的是蜂鸣器,所以我们这里写成 Beep,如图 62.4.3:( J) v& o) e% S3 k

3 R( j$ u; v- p) X第一步,我们把 C 语言控制蜂鸣器代码的头文件,添加到我们刚才添加 Beep 类生成的文件 beep.h 里面,但是头文件我们不能直接复制过去,我们要用 extern “C”{}括起来,代码如下:2 @& [* D+ ]/ C% h, o; S( Z
extern "C"{
- _5 T2 @7 D* }#include "stdio.h" #include "unistd.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "stdlib.h" #include "string.h" }
# G. K$ S7 Z) J7 ?. z添加完成如图 62.4.4 所示:
0 ~+ P4 Z( k- p( m% }! W% ?" r' h& \9 d3 k5 w
图 62.4.4. E: `& K2 d1 P; O
第二步,把我们 C 语言控制蜂鸣器里面的参数定义复制到 public 下面,代码如下:/ l' S& t6 j5 ?+ u' u/ K% e2 T
int fd, retvalue;
! ]% j8 K0 P/ ochar *filename;, D$ l# X+ l3 D) M; d  V
unsigned char databuf[1];% l+ l* \6 n* d6 x; J0 |1 d
添加完如图 62.4.5 所示:
/ f# b/ x" o& @, I( ^" c1 d6 r0 @: O0 f* P* m
然后我们打开 beep.cpp,把 C 语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面,注意,QT 里面我们不能使用 printf,代码如下:0 a5 g, }/ ]( G" d) `8 [
/* 打开 beep 驱动 */
) R8 q4 t/ G, h0 e% mfd = open(filename, O_RDWR);1 h1 D" X- u7 |+ r5 a9 h8 ~
if(fd < 0){; D  Q9 q, s+ [" ^) r5 F
return ;
9 F7 T% e9 p. b, S& Y7 N}6 o( S0 x3 Q& ?% P6 p
添加完如图 62.4.6 所示:
. S( G! F& N  Z$ F8 A9 S! @: Z5 f; g
图 62.4.6
( A" E* `+ w: q: C: ]& F  u1 j然后我们创建一个打开蜂鸣器和一个关闭蜂鸣器的函数,第一步,现在 beep.h 里面声明,然后在
/ f3 K) E/ Y. P1 U, D# \( H! V2 R: Vbeep.cpp 里面实现。
1 Y/ Q* T* X1 k" r( B% {5 ^# k声明:
/ @, r& N2 m6 O3 U' x$ Q, k代码如下:: L0 {7 h' y5 o8 \
void Beep_On();2 _2 s$ b- l  Z
void Beep_Off();
* X* j, [* g0 v/ m  p6 o添加完如图 62.4.7 所示:
% L) W# h8 D: [& ?/ y7 y0 ?, w, O% l1 z' S
图 62.4.7
' X# y" _, f$ V0 {实现:  A2 `2 N& d5 }# x- Q+ j( U4 i
代码如下,注意 c 语言函数前面要加::,表示这个函数是 C 函数。
( ~0 c# k; ]) |3 m- [$ b* q2 u0 ~void Beep::Beep_On()
& [2 |6 Q, Q) `( [' e- {( @{/ }- a6 x. U$ ^1 H9 J! E. ?
/* 向/dev/beep 文件写入数据 */
6 |2 i/ D( A& _' Y9 odatabuf[0] = 1;
# [  ~8 y* M; P: \retvalue = ::write(fd, databuf, sizeof(databuf));
) Y. C' c& }/ Z. p8 Eif(retvalue < 0){
8 l* B5 B; _2 Q5 B! a::close(fd);
, @' f3 q+ M; y! T( W7 H: _return ;+ `* |( v9 ~7 T5 O5 {6 X6 G
}0 R( A* H. ^6 ^' r1 P" J  S, W
}! L! r1 r. H& I6 V  @" N
void Beep::Beep_Off()3 w3 [# |0 o% ?/ `. ?9 @
{, I0 j7 g) X9 b( P) e8 \1 t
databuf[0] = 0;
. P- |4 I5 z) L2 M+ d6 sretvalue = ::write(fd, databuf, sizeof(databuf));
5 \/ S- {9 A5 ~7 V7 Uif(retvalue < 0){
- Q5 L( m( l# t8 o  S8 h::close(fd);
- H$ c) b# c  H9 G" Q: ^. nreturn ;
8 \) k6 C: X4 i# Q}
) _; O6 [5 o9 O}. @7 _+ A0 d( [  z7 z! C
添加完如图 62.4.8 所示:
9 ]- K$ R. `) o) u6 r7 g/ y0 E9 {3 K. j! h
图 62.4.8
- q; z& @" F. h8 E8 X添加好了之后,我们直接使用这个类就可以了,我们先在 widget 里面新建一个 beep,0 K' e$ Q& T! i
然后我们在构造函数里面新建一个对象,如图 62.4.9 所示:0 `7 R' `, l; A* E5 Q1 }* h
" q. `  ]* r/ G, `& \7 J% H# f
图 62.4.9
" S# Z7 J9 q4 c/ y9 ?+ d* ]! c( f然后我们在槽函数里面执行对应的打开和关闭动作即可,如图 62.4.10 所示:+ r" K5 Q2 l( b

. E3 ]+ w1 N" _3 `% {+ G6 t+ y9 F0 q+ e. }# w0 `

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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