标题 | 采用USB OTG实现手机和无线FM监测模块的通信 |
范文 | 何晓东 徐树良 摘要:现有一个无线调频信号监测功能模块,用于测量FM信号的场强。本文设计一个方案,手机通过USB线连接该模块,编写手机APP实现通过手机对该模块的进行参数设置、读取场强等测量数据等功能。 关键词:USB通信;USB OTG 中图分类号:TP311文献标识码:A 文章编号:1009-3044(2020)22-0052-02 开放科学(资源服务)标识码(OSID): 无线调频信号监测模块(以下简称监测模块)属于无线FM信号监测系统的前端采集部分,无线FM信号监测系统目的是把室外实时监测的FM信号数据通过无线公网发送到远端的数据库保存。设计使用手机USB接口通过USB线连接监测模块,通过开发手机APP用于设置监测模块的监测频率等工作参数、启动/停止监测功能、接收监测数据并显示同时发送到远程数据库。 1 USB OTG简介 USB(通用串行总线)是一个串行通信标准,广泛用于手机、PC等设备。具有传输速度快、热插拔等特点。一个日常的例子:手机通过USB线连接PC机,把手机拍摄的照片等文件传输到PC机保存。USB接口有5根线,分别是电源正、电源负、数据正、数据负、模式。USB通信模式分为USB HOST和USBOTG。 Host模式(主机模式),指在USB通信中PC为USB主机,其他的通信方为USB设备。USB主机控制数据的传输,USB設备只能同USB主机进行通信。例如:手机同PC的连接,PC是USB主机,手机是USB设备,由主机(PC)控制两者间的通信。 OTG模式(无主机模式),指在USB通信中没有USB主机(PC),通过模式线设置将其中的某设备设置为主设备,由主设备管理通信,从而解决没有主机(PC)的情况下USB设备间的通信问题。例如:手机通过USB接口连接U盘。 在OTG模式中,若模式线悬空,则该设备被设置为USB设备。若模式线接地时,该设备被设置为主设备。手机USB接口具备OTG功能,只是通常的USB连接线只用4根线,手机端模式线未接(手机端USB接口芯片模式脚悬空),手机被设置为从设备,当用这种只有4根线USB连接线连接手机和PC机时,PC为主设备。 本方案采用USG OTC线(5线USB连接线),将其中的模式线接地(使手机端USB接口芯片模式脚接地),就能设定手机为主设备,同时监测模块设置为从设备,开发手机APP来使手机同监测模块间的进行通信,发送命令给监测模块和接收监测模块发送的监测数据。 2 监测模块用单片机 监测模块的主控器采用具有USB OTG功能的单片机,型号是STM32F107RC,属于ST公司ARM32位CORTEX-M3芯片,集成USB2.0 0TG接口,主频74兆,RAM 64K,FLASH 256K.其中PA12、PA13分别是USB_OTG_FS_DP和USB_OTG_FS_DM脚,需软件配置为USB DEVICE模式。 3 监测模块USB通信相关程序设计 主要是编写USBD_CustomHID_fops_FS中相关函数实现,主要是USTOM_HID_Recv_FS和USBD_CUSTOM—HID_SendRe-port_FS函数,分别是USB消息接收函数和发送函数。 3.1 接收函数 该函数为接收手机通过USB发送的信息,函数框架为: static int8_t CUSTOM_HID_Recv_FS(uint8_t*Buf, uint32_t*Len) { //端点2接收中断清零 EP2_INT_Comein=0; //复制接收的信息到用户定义的存储区(在主程序中处理接收的信息) CopyStr(Buf,Rx_ORDER_Buffer,*Len); //修改接收标识为1,表示接收到主机信息 order_stat=l; //返回结果 return (USBD_OK); ) 3.2 发送函数 该函数实现通过USB向手机发送信息 static int8_t USBD_CUSTOM_HID_SendReport_FS(uint8_t*report, uint16_t len,uint8_t ep_addr) { //直接调用底层函数发送 return USBD_CUSTOM___ HID—SendReport(&hUsbDeviceFS,report, len,ep_addr); } 3.3 主程序结构 主程序循环调用dispatch函数,在dispatch函数中检查信息接收标识,处理手机发送的命令,并把结果发送回手机。Dis-patch函数框架如下: void Dispatch(void) {// ifTorder_staty/usbin节点收到信号标识 { order_stat= 0;//清除接收标识 USB_HandOrder20;//处理接收到的命令(略) ) if(UpdateMonitory/是否需要新的监测数据 { UpdateMonitor=0; uint16_t length=2;//准备数据 UsbUpLoardDataBuffer[0]_ (uint8_t) (hostcommand. comman-did);//命令ID UsbUpLoardDataBuffer[l] =seqtag++;length+=ConvertToBytes(hostcommand. freql, &(UsbUpLoardDataBuffer[2]);,/填充监测频率 length+=FiIIES(&(UsbUpLoardDataBuffer[6]》;//填充监测的信号场强 length+=FiIISN (&(UsbUpLoardD ataBuffer[7]);//填充监测的信号SN length=8;//设置数据长度 //发送数据到主设备USBD_CustomHID_fops_FS. SentData(UsbUpLoardDataBuffer,length,CUSTOM_HID_EPIN I_ADDR); 】 ) 4 手机USB通信相关程序设计 接收监测模塊发送的数据线程框架: class usbRecvMessagThreadextends Thread{ UsbEndpointepln; UsbDeviceConnectionusbconnection;private Handler messagHandler;// public usbRecvMessagThread(UsbDeviceConnection connec-tion, UsbEndpointepln, Handler msgHandler){ this.connection= connection;this.epln= epln; this.messagHandler= msgHandler; ) public void run0{ byte[] RecvBuffer= new byte[64];,/创建缓冲区, intlength= RecvBuff'er.length; inttimeout= 6000; while (!Thread.interrupted0){ intrecvcount = connection. bulkTransfer(epln, RecvBuffer,length, timeout);//接收数据 if (recvcount<0){//没有接收到数据,则继续循环 continue; ) Message message= new Message0;//创建新消息 message.what= Ox2678; message.obj= RecvBuffer; messageHandler. sendMessage(message);//发送接收的消息(在主程序处理) ) 】 ) 5 结束语 通过对STM32F107数据手册的研读和参考相关USB OTG的资料和例程,结合监测需求,实现了手机同监测模块的通信,经测试,达到了预期的功能。 参考文献: [1]周立功.等.USB2.0与OTG规范及开发指南[M].北京:北京航空航天大学出版社,2004. [2]王翠萍.Android Studio应用开发实战详解[M].北京:人民邮电出版社。2017. 【通联编辑:闻翔军】 基金项目:安徽省教育厅自然科学重点项目“无线广播信号覆盖监测系统开发”(编号KJ2016A113) 作者简介:何晓东(1968-),男,安徽长丰人,副教授,研究方向为计算机应用技术;徐树良(1986-),男,安徽休宁人,工程硕士,研究方向为计算机应用技术。 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。