采用USB OTG实现手机和无线FM监测模块的通信

2020-10-09 10:24何晓东徐树良
电脑知识与技术 2020年22期

何晓东 徐树良

摘要:现有一个无线调频信号监测功能模块,用于测量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-),男,安徽休宁人,工程硕士,研究方向为计算机应用技术。