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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
我们在 QT 上要怎么操作驱动呢?比如,我们要点亮一个 led 灯,我们在 C 语言中可以使用 open,read,write,ioctl 函数来进行操作,但是 QT 上我们使用的语言是 C++,那我们要怎么来操作驱动呢?6 e+ X: t! s; M$ _: W
我们可以使用 C 和 C++进行混合编程,我们先来看一个控制蜂鸣器的 APP 代码,这里以终结者 I.MX6ULL为例,iTOP-4412 可参考测例程代码,代码如下:
  L# w. Y9 }) Y8 f: s! H8 h#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# p" s4 a; O! y7 S: Z
#define BEEPON 16 U% q1 [8 V( P; S+ B3 W. m
/*
6 Z6 F0 F8 K  K* @description : main 主程序7 s4 J3 l) v5 p  ~* L! e
* @param - argc : argv 数组元素个数1 |( b, k* q* P# y# F# v
* @param - argv : 具体参数
; k! D% r/ V8 g, F* u( X$ }* \, {* @return : 0 成功;其他 失败
6 S* g5 Y- F8 [! p*/
% F2 h+ n8 f$ c6 o6 Dint main(int argc, char *argv[])
4 Z, _! p9 X7 k+ Q% x{1 p, P+ t9 C* P2 l, |! V& w
int fd, retvalue;1 @- W" Z# e# N7 ^# w
char *filename;
5 n. u& y3 d) D; hunsigned char databuf[1];
$ h2 e& \" d! k; d9 p4 Z, s+ mif(argc != 3){
, Y/ W$ w% j0 U4 @& F4 q! yprintf("Error Usage!\r\n");
3 \8 L) V  T3 {/ @3 r/ w* nreturn -1;  F/ W; {1 A0 s
}
2 h" D5 U0 _9 V8 ofilename = argv[1];
- H, [: d# ^& p0 x2 c/* 打开 beep 驱动 */1 O- Q( e* ?6 u/ p  A' u6 D
fd = open(filename, O_RDWR);$ W5 Q6 i- w' ~& ^9 U
if(fd < 0){
( |  z9 h- Y' D: I& fprintf("file %s open failed!\r\n", argv[1]);5 B# J; @$ b9 x- A& L, n: f3 ]
return -1;
4 s: ]" z/ q2 H7 \  g}. F! n. j& N: }2 y
databuf[0] = atoi(argv[2]); /* 要执行的操作:打开或关闭 */) X+ A  L1 s- h* x" h
/* 向/dev/beep 文件写入数据 */) T1 y: ?; |8 W% c
retvalue = write(fd, databuf, sizeof(databuf));: j! o% z5 ?/ N, a% Q: m/ U
if(retvalue < 0){
- ?: e$ X1 X; I) fprintf("BEEP Control Failed!\r\n");; j8 y1 y8 H5 h: T- O7 B: H; Q
close(fd);
4 W  Y6 g9 r' vreturn -1;
, |# w) _/ _& A" e- J}1 a- i  t6 ]0 `. m3 M! t0 [8 V8 [5 m
retvalue = close(fd); /* 关闭文件 */- v, g  Z7 j4 w- o8 @4 N
if(retvalue < 0){( u, A* t$ W. K
printf("file %s close failed!\r\n", argv[1]);8 m. G. Y- v  w0 J0 h
return -1;
9 H" O, {) x- z" T5 c$ n6 ~) z: r}% R% H1 B0 b2 Y8 c, v6 R
return 0;9 @% H2 i  I/ u6 y6 ^  N; t! j
}: C4 ?- b) ~, F0 y
通过上面的代码我们可以发现,使用 C 语言来控制一个蜂鸣器,无非就是打开设备节点,然后通过 write来写入数据就可以控制蜂鸣器了。既然我们可以使用 C 和 C++混合编程,那么我们是不是只需要把这个 C控制蜂鸣器的代码直接加到 QT 程序里面就可以了,那我们我们要怎么进行混合编程呢?
) d; |7 B! v$ B# R我们先新建一个 QT 工程,然后添加俩个按钮来控制蜂鸣器的打开和关闭,UI 界面如图 62.4.1:+ u$ B- ]; Q- A9 X* ~/ u3 u
& w' F$ |. |" h( l+ o. k. C; X
然后我们开始移植代码,因为 C++是面向对象的,C 是面向过程的,所以在 QT 上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把 C 语音控制蜂鸣器的代码封装成一个类。) N  `" \! n  U. {5 T; |/ y' k
我们右键选中这个工程,然后选择添加新文件,添加 C++ Class 如图 62.4.2:5 Y6 ^! P& f, W  H

3 p* w- `/ a4 J! T1 D/ @, N然后我们添加类的名字,因为我们操作的是蜂鸣器,所以我们这里写成 Beep,如图 62.4.3:
) A5 F0 h+ v& h, ]6 w4 R
( T0 g5 |- p  ^% e- V+ ~第一步,我们把 C 语言控制蜂鸣器代码的头文件,添加到我们刚才添加 Beep 类生成的文件 beep.h 里面,但是头文件我们不能直接复制过去,我们要用 extern “C”{}括起来,代码如下:% Y' B% w, b/ J6 c* M+ ~
extern "C"{
6 w8 H+ m: {/ w$ Q- r0 ^& }#include "stdio.h" #include "unistd.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "stdlib.h" #include "string.h" }; q. I) ~( Q, c. D
添加完成如图 62.4.4 所示:3 n' I: ]6 M; P+ i2 Q

) Q1 L9 k) ]9 W" r- w+ W4 g2 V9 K图 62.4.4
% k3 S& }: H5 N+ q0 k! x第二步,把我们 C 语言控制蜂鸣器里面的参数定义复制到 public 下面,代码如下:, t1 ~0 n* d( z0 V
int fd, retvalue;
# K$ J9 x* L/ X2 ^1 Echar *filename;
& ]0 x! P$ E; E# e5 [% ^; zunsigned char databuf[1];8 z8 \& u/ n1 H9 c" \  `& x5 ^  c
添加完如图 62.4.5 所示:8 `$ _3 m3 K. B6 Y
) a2 j6 N9 U+ Y& T2 H
然后我们打开 beep.cpp,把 C 语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面,注意,QT 里面我们不能使用 printf,代码如下:
, Q% y5 D7 Y) v) _/ o/* 打开 beep 驱动 */6 {: ]! g( I* K6 |/ h/ s
fd = open(filename, O_RDWR);
3 I6 Y8 q4 X) z0 }4 h7 G' ^8 fif(fd < 0){
) S  y( ^" C4 R# L' D8 c5 nreturn ;
! D( a  o" _" K! t) G+ Z7 B( Z. U8 ~}" w2 |0 H2 [" k7 p% s  z1 ~6 n
添加完如图 62.4.6 所示:  A( \: ^7 Q" n7 v/ A" T9 \5 g
7 ]$ {5 H% f  D1 Y: g
图 62.4.6
. u: h. v/ L1 L( B然后我们创建一个打开蜂鸣器和一个关闭蜂鸣器的函数,第一步,现在 beep.h 里面声明,然后在
/ y  L- Y/ w, vbeep.cpp 里面实现。5 H5 Y$ l* h* S) }! {* J; x* t
声明:
9 F% Q7 g9 S& H+ o代码如下:! S9 B2 @: r+ x/ v9 `+ X: B: M
void Beep_On();. }# w! s$ ~7 B! O" A6 q3 k; O
void Beep_Off();( j# U" i! n" ~* G+ [% ~3 d
添加完如图 62.4.7 所示:. {- d9 }) u- |6 l- H7 T
  q& ^8 e" c! K1 W7 J/ P
图 62.4.78 K8 B, N$ o/ L8 o& g0 Y5 l
实现:  q( }# i$ n! _
代码如下,注意 c 语言函数前面要加::,表示这个函数是 C 函数。
& I; d3 J# o  Q8 [void Beep::Beep_On()7 X! ^1 R2 ^) W: C. |
{6 w) I* h9 Z9 |. D, e% b; b
/* 向/dev/beep 文件写入数据 */
- S* a3 E$ n4 g: v! u& Kdatabuf[0] = 1;
! |: v! E& w7 t( d9 [. hretvalue = ::write(fd, databuf, sizeof(databuf));
  e2 t  O! _' Wif(retvalue < 0){
1 |9 c! c6 ^. I) [: \5 ~$ W1 x) f8 Y::close(fd);
3 v  w0 e: n: }9 lreturn ;
$ S, U) X& @' \: `/ S}
0 U) m# s8 E: e+ A9 Z( _% \}! q, D4 y8 R+ y) ]7 H6 A
void Beep::Beep_Off()8 g, I9 }8 ?! K5 k
{
$ `2 x" u1 i1 R2 c$ F6 D- S1 Gdatabuf[0] = 0;
1 C- Y" U! L5 y) h# Aretvalue = ::write(fd, databuf, sizeof(databuf));7 X$ h; f9 M  H
if(retvalue < 0){
+ U- f. V. t. l: ~- \& w::close(fd);3 @: r4 Y/ {, s& _3 o" Y
return ;
8 o9 X% p5 F! i. o}0 h4 b) M2 D  Z. ?
}* V1 K6 n6 W# \& `
添加完如图 62.4.8 所示:
( e. A; _" ~( ?) X" d" [$ q' a1 p- u0 |+ U' w9 r) v4 @8 J9 q# l2 f
图 62.4.8+ }& K: c4 U* ~/ h2 T) B- y
添加好了之后,我们直接使用这个类就可以了,我们先在 widget 里面新建一个 beep,6 U/ y! f) o# T; g, D3 n% b  t/ @
然后我们在构造函数里面新建一个对象,如图 62.4.9 所示:5 ~2 k1 h  t* ]6 v

+ f  \  X, I% [4 Z+ R6 N* t; ]图 62.4.91 X2 O2 `- r3 I, }) t1 D
然后我们在槽函数里面执行对应的打开和关闭动作即可,如图 62.4.10 所示:
, r( B% P% Z  m' |' f
5 M! R  n, @* X$ [& c
' N) J, u% D8 b$ X6 y- D: M

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 12:57 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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