基于QT的实验平台模块控制设计Word格式文档下载.docx
《基于QT的实验平台模块控制设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于QT的实验平台模块控制设计Word格式文档下载.docx(38页珍藏版)》请在冰点文库上搜索。
#include"
PWMthread.h"
//包含PWM线程类的声明
uartThread.h"
//包含UART线程类的声明
canThread.h"
//包含canThread线程类的声明
/*IOCTLcommands*/
#defineLED_IOC_WR_ON1//LED灯亮
#defineLED_IOC_WR_OFF0//LED灯灭
#defineDCM_IOCTRL_STARTPWM(0x10)//PWM开始工作
#defineDCM_IOCTRL_SETPWM(0x20)//设置PWM
#defineDCM_IOCTRL_STOPPWM(0x30)//停止PWM
#defineDCM_TCNTB(16384)
#defineDCM_FACTOR(DCM_TCNTB/1024)
namespaceUi
{
classLed;
}
classMyLed:
publicQWidget
Q_OBJECT
public:
MyLed(QWidget*parent=0);
~MyLed();
protected:
voidchangeEvent(QEvent*e);
private:
Ui:
:
Led*ui;
intfd1;
//用于LED设备文件
intfd2;
//用于CAN总线设备
PwmThread*pwm;
//定义pwm线程对象
uartThread*uart;
//定义uart线程对象
canThread*canSend;
//定义CAN总线接收线程对象
canThread*canRec;
//定义CAN总线发送线程对象
//槽函数
privateslots:
voidchange_tab(intindex);
//切换TAB
//LED控制
voidon_led3_off_clicked();
//按钮led3_off按下LED3灭
voidon_led3_on_clicked();
//按钮led3_on按下LED3亮
voidon_led2_off_clicked();
voidon_led2_on_clicked();
voidon_led1_off_clicked();
voidon_led1_on_clicked();
//DC-MOTOR控制
voidon_dc_off_clicked();
//按钮dc_off按下电机停止运转
voidon_dc_right_clicked();
//按钮dc_right按下电机顺时针转
voidon_dc_left_clicked();
//按钮dc_left按下电机逆时针转
voidon_dc_cycle_clicked();
//按钮dc_cycle按下电机先顺时针转后逆时针转
//uart通信控制
voidon_s_led1_on_clicked();
//按钮s_led1_on按下发送信号,接收方LED1亮
voidon_s_led2_on_clicked();
//按钮s_led2_on按下发送信号,接收方LED2亮
voidon_s_led3_on_clicked();
//按钮s_led3_on按下发送信号,接收方LED3亮
voiduart_receive(QString);
//串口接收到数据的处理
voidon_all_off_clicked();
//按钮all_off按下发送信号,接收方所有LED灭
voidon_text_clear_clicked();
//按钮text_clear按下清除显示文本
//CAN总线通信控制
voidon_leds_on_clicked();
//按钮leds_on按下发送信号,接收方所有LED灯亮
voidon_leds_off_clicked();
//按钮leds_off按下发送信号,接收方所有LED灯灭
voidon_hello_clicked();
//按钮hello按下发送"
Hello"
voidcan_receive(QString);
//接收到数据的处理
voidon_can_clear_clicked();
//按钮can_clear按下清除CAN总线通信的显示窗口
};
#endif//LED_H
/*=========================================\
*FILE:
PWMthread.h
*FUNCITION:
定义PWM线程类,实现PWM的控制
\*============================================*/
#ifndefPWMTHREAD_H
#definePWMTHREAD_H
#include<
QThread>
classPwmThread:
publicQThread//继承QThread类
PwmThread();
//构造函数
~PwmThread();
//析构函数
voidrun();
//重载run()函数,实现自定义功能
voidThreadStart();
//启动线程
voiddelay(intt=0);
//延时
intmode;
//电机的转动模式控制:
0停止,1正转,2反转,3正反
intdcm_fd;
//设备文件
intsetpwm;
//定义占空比
intflag;
//标志:
0退出线程,1正常
#endif//PWMTHREAD_H
*FILENAME:
canThread.h
定义CAN总线通信线程类,实现CAN总线通信的控制
#ifndefCANTHREAD_H
#defineCANTHREAD_H
stdio.h>
time.h>
sys/types.h>
sys/ipc.h>
pthread.h>
#defineUPCAN_IOCTRL_SETBAND0x1//设置波特率
#defineUPCAN_IOCTRL_SETID0x2//设置CAN总线的ID
#defineUPCAN_IOCTRL_SETLPBK0x3//设置CAN总线的工作模式:
1自循环模式,0正常模式
#defineUPCAN_IOCTRL_SETFILTER0x4//设置CAN总线的过滤器
#defineUPCAN_IOCTRL_PRINTRIGISTER0x5//输出SPI和portE的寄存器信息
#defineUPCAN_EXCAN(1<
<
31)//设置外部CAN标记flag
#defineMAX_CANDATALEN8//定义CAN总线数据的最大长度
#defineCAN_DEV"
/dev/can/0"
//定义CAN总线设备文件
//定义波特率枚举变量
typedefenum{
BandRate_125kbps=1,
BandRate_250kbps=2,
BandRate_500kbps=3,
BandRate_1Mbps=4
}CanBandRate;
//定义CAN总线数据结构体
typedefstruct{
unsignedintid;
//CAN总线ID
unsignedchardata[8];
//CAN总线数据
unsignedchardlc;
//数据长度
intIsExt;
//是否扩展总线
intrxRTR;
//是否扩展远程帧
}CanData,*PCanData;
/*********************************************************************\
CAN设备设置接收过滤器结构体
参数:
IdMask,Mask
IdFilter,Filter
是否接收数据按如下规律:
MaskFilterRevIDReceive
0xxyes
100yes
101no
110no
111yes
\*********************************************************************/
typedefstruct{
unsignedintMask;
unsignedintFilter;
//是否扩展ID
}CanFilter,*PCanFilter;
//canThread类的定义
classcanThread:
publicQThread
Q_OBJECT//申明为包含自定义信号槽的类
canThread(intfd=0);
//重载run()函数
voidcanRev();
//接收数据
voidCanSendString(char*pstr);
//发送数据
//线程标记,1工作,0停止
intcan_fd;
//CAN总线设备文件
intrecv_status;
//接收0停止,1开始
intsend_status;
//发送0停止1开始
intstatus;
//0接收,1发送
QStringsendbuf;
//待发送的数据
signals:
voidrecv_can(QStringstr);
//自定义的接收数据信号
#endif//CANTHREAD_H
FILENAME:
uartThread.h
FUNCTION:
定义uart通信线程类
#ifndefUARTTHREAD_H
#defineUARTTHREAD_H
classuartThread:
publicQThread
uartThread();
~uartThread();
//线程标记:
0停止,1运行
intuart_fd;
//uart设备文件
//uart接收标记
//uart发送标记
//uart发送的数据
voidrecv_uart(QStringstr);
//接收到数据发出信号
publicslots:
#endif//UARTTHREAD_H
PWMThread.cpp
FUNCTION:
PWM线程类的实现
#include"
//PWM线程类的定义
#defineDCM_IOCTRL_STARTPWM(0x10)
#defineDCM_IOCTRL_SETPWM(0x20)
#defineDCM_IOCTRL_STOPPWM(0x30)
#defineDCM_TCNTB(16384)
#defineDCM_FACTOR(DCM_TCNTB/1024)
//构造函数
PwmThread:
PwmThread()
this->
flag=1;
//线程工作标记为1
mode=0;
//电机动作模式为0,即停止
setpwm=0;
//占空比为0
//析构函数
~PwmThread()
:
close(dcm_fd);
//关闭设备文件
//重载线程类的run()函数,实现自定义的功能
voidPwmThread:
run()
intstatus=1;
//用于控制反向
inti;
dcm_fd=open("
/dev/dcm/0raw"
O_WRONLY);
//打开设备文件,写方式
if(dcm_fd<
0)//打开设备文件失败
{
qDebug("
cannotopendevice/dev/dcm/0raw"
);
}
while(flag)//如果线程为工作状态
if(this->
mode==0)//方式0工作,电机停转
ioctl(dcm_fd,DCM_IOCTRL_STOPPWM,mode);
elseif(mode>
=1&
&
mode<
=3)//方式1-3工作
ioctl(dcm_fd,DCM_IOCTRL_STARTPWM,mode);
for(i=512;
i>
=-512;
i--)//控制速度从低到高
if(status==1)setpwm=i;
elsesetpwm=-i;
ioctl(dcm_fd,DCM_IOCTRL_SETPWM,setpwm*DCM_FACTOR);
delay(500);
status=-status;
//启动线程
ThreadStart()
start();
//延时函数
delay(intt)
for(;
t>
0;
t--)
for(i=0;
i<
400;
i++);
canThread.cpp
canThread线程类的实现
canThread:
canThread(intfd)
flag=1;
//工作标志置1
status=0;
//接收状态
recv_status=0;
//接收状态停止
send_status=0;
//发送状态停止
can_fd=fd;
//打开设备文件
//重载run()函数
voidcanThread:
intid=0x123;
//CanID
CANThreadstart:
"
ioctl(can_fd,UPCAN_IOCTRL_PRINTRIGISTER,1);
//输出SPI和portE的寄存器信息
ioctl(can_fd,UPCAN_IOCTRL_SETID,id);
//设置CAN总线的ID
#ifdefDEBUG
ioctl(can_fd,UPCAN_IOCTRL_SETLPBK,0);
//设置CAN总线的工作模式:
#endif
/*Createthethreads*/
while(flag)//线程工作
recv_status==1)//如果为接收状态
canRev();
send_status==1)//如果为发送状态
CanSendString(sendbuf.toLatin1().data());
//发送状态置0,防止重复发送
close(can_fd);
//接收数据
canRev()
CanDatadata;
intcount;
QStringstr;
count=read(can_fd,&
data,sizeof(CanData));
//接收数据到data,并用count接收read()返回的接收到的数据长度
if((data.dlc>
0)&
(count>
0))//若接收到有效数据
str=str.sprintf("
%s"
data.data);
//将unsignedchar*数据转换为QString类数据
emitrecv_can(str);
//发出接收信号
//发送数据
CanSendString(char*pstr)
intlen=strlen(pstr);
memset(&
data,0,sizeof(CanData));
//初始化data
data.id=0x123;
//设置dataid
data.dlc=8;
//设置数据长度
len>
MAX_CANDATALEN;
len-=MAX_CANDATALEN)
memcpy(data.data,pstr,8);
//复制数据到Pstr
write(can_fd,&
data,sizeof(data));
//写数据到文件
pstr+=8;
//写下一字节数据
data.dlc=len;
//设置数据长度
memcpy(data.data,pstr,len);
//写数据文件
//写数据
start();
led.cpp
实现程序中LED的控制及PWM线程,can线程,uart线程的控制
led.h"
ui_final.h"
externintstatus;
//防止电机开机运行
MyLed:
MyLed(QWidget*parent):
QWidget(parent),ui(newUi:
Led)
ui->
setupUi(this);
fd2=open("
O_RDWR|O_NONBLOCK);
//CAN