您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页通信课外实践报告 (2)

通信课外实践报告 (2)

来源:华佗健康网


通信工程课外实践报告

学 院 信息工程学院 专 业 通信工程 班 级 1321301 学 号 201320130101 姓 名 肖庭林

指导教师 饶志华老师

智能WIFI音频播放器软件设计

摘要

整个软件系统由两个部分组成,PC机部分和单片机端,单片机端利用串口实现了一个简单的Shell用户交互系统,用户可以利用超级终端向单片机发送指令,比如监听端口,播放歌曲等命令,用户Shell本身作为一个用户线程运行在FreeRTOS中,此线程阻塞在串口接收,当用户键入命令后首先线程会解析本条指令,如果是合法的指令则会立即执行,对于“WIFI音频播放器”实例来说,一般应先发送“listenport”指令启动指定端口的监听,当PC机连接到本地端口后,再发送“playmusic”指令,此时单片机会通知PC机发送音频流,单片机将收到的音频流通过SPI总线发送至VS1003解码芯片中。PC机端会主动连接指定端口,当连接上后,等待“playmusic”指令,收到播放指令后随即开始音频数据的发送。

关键字:WIFI;SPI总线;音频播放器;GetCmdString函数

1.1 单片机端用户Shell设计

Shell命令包括两个部分,一是命令名,二是命令参数。命令名是必有的输入,命令参数可选,设计了一种数据结构包括命令名和处理此命令的函数指针,如下:

typedef BOOL(*USER_CMD_HANDLER)( void *parameter );/* 命令的函数类型定义 */

typedef struct _cmd_parse {

signed char cmd_name[10]; /* 命令名 */

USER_CMD_HANDLER cmd_handler; /* 执行命令的函数指针 */ } CMDPARSE;

CMDPARSE cmdstruct[] = { /* 以下是系统预设的指令Handle函数 */

{ \"scannow\ ScanNowHandler },

{ \"playmusic\ PlayMusicHandler },

{\"listenport\ ListenPortHandler } };

GetCmdString阻塞等待一条命令字串指令1Listenport指令2Playmusic指令nCmdResolve命令解析返回命令索引和参数CmdParse命令执行调用Handle函数指针

图7.4 Shell软件流程图

线程一般会阻塞在GetCmdString函数中,此函数会等待获取一条新的指令。当线程获得一条指令后,执行CmdResolve函数,该函数会比对输入的命令和cmdstruct命令数组中的预设命令进行比对,并获得输入命令的index(未识别的命令会返回0xff)。CmdParse函数会根据命令index在cmdstruct数组中调用handle函数指针。

1.2 Playmusic指令handle函数设计

Playmusic实现了音乐播放的全部功能,功能如下:1. 指定歌曲名的播放 2. 播放时的暂停 3. 停止播放 4. 音量调节 5. 播放曲目的切换 6. 简单的文本界面

播放函数实现了一个简单的状态机: typedef enum _play_state { STATE_OPEN,

/* 文件打开状态,向PC端发送要打开的文件名 */

STATE_PLAYING, /* 文件播放状态,接收音频流并播放,同时检测

有无用户交互 */

STATE_HALT,

/* 暂停播放状态,暂停音频流接收,检测用户是否重新启动播放 */

STATE_STOP /* 播放停止状态,播放停止后立即结束playmusic

函数 */

}PLAY_STATE;

播放handle整体状态如图1.5所示。

单片机和PC机TCP连接成功后,单片机端和PC端随即采用规定的通信格式进行通信,通信格式如下:

typedef struct __attribute__ ((packed)) net_frame { WORD type; WORD length; }NET_FRAME,*pNET_FRAME;

以上是通信数据的帧头,也就是说每一帧的前4个字节的数据反映了该帧的基本情况,type有两种取值,一种是cmd,一种是data,cmd反映此帧为一命令帧,data反映此帧为一数据帧,len反映帧中实际的数据长度,取值最小值为0。

PlayMusicHandler参数:播放歌曲名初始化STATE_OPENSTATE_OPEN发送file name等待file length进度条初始化Receive File lengthReceive Music dataSTATE_PLAYING接收音频数据更新进度条检测用户输入User inputKey = ctrl+cReceiveFile nameUser inputKey = left or rightUser inputKey=Space切换歌曲发送切换指令STATE_HALT检测用户输入STATE_STOP通知PC机停止发送

图1.5 handle状态图

1. 3 PC机端网络程序

PC机主动连接单片机端,被动的接收来自单片机端的命令并执行,如图1.6。

连接单片机Has connected接收一个网络帧解析网络帧执行帧命令handle

图1.6 PC机命令解析

PC机连接上单片机后,等待一个网络帧的到达,当收到网络帧后,解析帧命令,这里只实现了一个帧命令,也就是playmusic帧命令,playmusic函数同样维护一个播放状态机。状态转换图1.7。

PlayMusicHandler参数为文件名END获得当前目录下的所有MP3文件命令帧为:结束播放发送结束应答命令帧为:切换歌曲发送下一曲nameNET_CMD_EXIT在当前目录下查找是否有传入的文件名默认STATE_FILEOPENSTATE_FILEOPEN等待open file网络帧NET_CMD_FILENEXTSTATE_PLAYING正常的播放状态检测有无命令帧Open ok 图1.7 PC端播放状态

1.4 测试结果

如下图1.8为在PC端运行测试图。

图1.8 PC端测试

1.5部分源程序:

FreeRTOS主程序:

#include #include

#include \"GenericTypeDefs.h\" #include \"HardwareProfile.h\"

#include \"FreeRTOS.h\" #include \"task.h\" #include \"queue.h\" #include \"semphr.h\"

#include \"FreeRTOSConfig.h\"

#include \"uart2.h\" #include \"usbtask.h\" #include \"wifitask.h\" #include \"usb_config.h\" #include \"USB/usb.h\" #include \"user.h\"

#include \"rt73usb_driver.h\" #include \"rt73debug.h\" #include \"usertask.h\" #include \"wifitask.h\" #include \"user_config.h\" #include \"arch/LwIPEntry.h\"

static BOOL InitializeSystem ( void );

static portTASK_FUNCTION( vLED1task, pvParameters );

/********************************************************************/

#pragma config UPLLEN = ON // USB PLL Enabled #pragma config FPLLMUL = MUL_20 // PLL Multiplier

#pragma config UPLLIDIV = DIV_2 // USB PLL Input Divider #pragma config FPLLIDIV = DIV_2 // PLL Input Divider #pragma config FPLLODIV = DIV_1 // PLL Output Divider #pragma config FPBDIV = DIV_2 // Peripheral Clock divisor #pragma config FWDTEN = OFF // Watchdog Timer

#pragma config WDTPS = PS1 // Watchdog Timer Postscale

#pragma config FCKSM = CSDCMD // Clock Switching & Fail Safe Clock Monitor

#pragma config OSCIOFNC = OFF // CLKO Enable

#pragma config POSCMOD = XT // Primary Oscillator

#pragma config IESO = ON // Internal/External Switch-over

#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (KLO was off)

#pragma config FNOSC = PRIPLL // Oscillator Selection #pragma config CP = OFF // Code Protect

#pragma config BWP = OFF // Boot Flash Write Protect #pragma config PWP = OFF // Program Flash Write Protect #pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel Select

RT73_DEVICE RT73Device; char dbg_buffer[100];

extern void vAltStartUSBRxTasks( unsigned portBASE_TYPE uxPriority );

static BOOL InitializeSystem ( void ) {

/* Set the system and peripheral bus speeds and enable the program cache*/ DDPCONbits.JTAGEN = 0; // 禁止JTAG口

SYSTEMConfigPerformance( configCPU_CLOCK_HZ - 1 ); mOSCSetPBDIV( OSC_PB_DIV_2 );

/* Setup to use the external interrupt controller. */ INTEnableSystemMultiVectoredInt(); /* LED初始化 */ mInitAllLEDs(); UART2Init();

/* 初始化SPI */ Vs1003_Init();

/* USB控制引脚初始化 */ LATDCLR = 0X0100; ODCD = 0X0100; TRISDCLR = 0X0100;

return TRUE; } // InitializeSystem

int main( void ) {

InitializeSystem();

/* 创建USB-HOST任务 */

/* 这些任务在系统初始化时进行创建,为的是防止重复创建任务 */ /* 基本上每个task中都利用了状态机*/

vAltStartUSBTasks( USBHOST_THREAD_PRIO );

vAltStartLwipTasks( TCPIP_THREAD_PRIO ); /* 创建用户命令解析任务 */

vAltStartComTestTasks( UART_THREAD_PRIO );

/* 创建一个led任务,当RT73未初始化时,led闪烁,当rt73初始化后led常亮 */

xTaskCreate( vLED1task, ( signed char * ) \"LED1task\configMINIMAL_STACK_SIZE, NULL, LED1_THREAD_PRIO , ( xTaskHandle * ) NULL );

/* Finally start the scheduler. */ vTaskStartScheduler(); return 0; }

/* LED1任务 */

static portTASK_FUNCTION( vLED1task, pvParameters )

{

( void ) pvParameters; while(1) {

/* 1s闪烁一次 */ mLED_1_Toggle();

vTaskDelay(1000/portTICK_RATE_MS); }

mLED_1_On();

vTaskDelete( NULL ); }

void vApplicationStackOverflowHook( void ) {

/* Look at pxCurrentTCB to see which task overflowed its stack. */ DBG_OUT(\"The heap is overflow!!\\r\\n\"); for( ;; ); }

1.6 心得结论

实践目标是实现利用PIC单片机驱动无线网卡进行WIFI联网控制,实践的创新性在于对802.11协议栈的裁剪使之适应资源和成本受限的应用,通过硬件系统的设计和软件程序的编写,基本达到了预期的目标,实现了RT73无线网卡驱动移植和802.11协议栈的裁剪,连接无加密无线AP,TCP/IP正常通信等功能。同时给出了一个利用控制方案的实例,实例测试表明,控制方案的性能较好,工作稳定,能够轻松的实时传输高质量的音频数据,视频数据经过压缩后也能够进行实时传输。

此外感谢在实践过程中饶老师对我的指导和帮助,在这期间我收获很大,也非常庆幸能够有机会接触的这些课堂内无法接触到的东西。

1.5参考文献

1 Jonathan Corbet,Alessandro Rubini,Gerg,Kroah-Hartman.LINUX

设备驱动程序.南京:东南大学出版社,2006

2 李红梅.WIFI技术在智能家居中的应用研究.Silicon Valley,2009 3 Mattbew Gast. 802.11无线网络权威指南.南京:东南大学出版社,

2007

4 W.Richard Stevens.TCP/IP IIIustrated Volume 1:The Protocols.北

京:机械工业出版社,2005

5 李英伟等.USB2.0原理与工程开发.北京:国防工业出版社,2007. 6 张俊. 匠人手记. 北京:北京航空航天大学出版社,2008.

7 Jean J.Labrosse. 嵌入式实时操作系统μC/OS-2,北京:北京航空航

天大学出版社,2003.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务