您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > MTK上位机通过串口发送指令操作手机
MTK上位机通过串口发送指令操作手机1/8/*测试的时候是在idleapp.c中测试的,在函数IdleSetLRKey中通过SetKeyHandler(start_uart_echo,KEY_LEFT_ARROW,KEY_EVENT_UP);来启动串口,然后就可以在上位机中通过串口调试助手发送指令操作MTK手机了*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#includestdC.h#includeMMI_Features.h/*编译开关会出现在这个由makeupdate生成的文件里面*/#includeL4Dr.h#includeL4Dr1.h#includeAllAppGprot.h#includeFrameworkStruct.h#includeGlobalConstants.h#includeEventsGprot.h#includemmiappfnptrs.h#includeHistoryGprot.h#includeMainMenuDef.h#includewgui_categories.h#includeUnicodexdcl.h#includegui_data_types.h#includeUart_sw.h#includeSettingProfile.h//我们要用到的串口,uart_port1是枚举型数值,usb串口的编号#defineHELLO_WORLD_UART_PORTuart_port1//手机接USB下载线的地方//定义我们的应用所属系统的哪一个模块//这里是MMI模块,实际上我更愿意称MMI为一个子系统,将我们的应用称为模块#defineMOD_HELLO_WORLDMOD_MMI//数据接收Buffer大小#defineMAX_ECHO_PACKET_LEN128//外部函数申明,没有对应头文件,手动加吧externmodule_typeUART_GetOwnerID(UART_PORTport);externvoidUART_ClrTxBuffer(UART_PORTport,module_typeownerid);externvoidUART_ClrRxBuffer(UART_PORTport,module_typeownerid);externvoidplayRequestedTone(ALL_TONE_ENUMplaytone);//本程序内部使用的函数申明staticvoidinit_uart(void);staticvoidmmi_HelloWorld_uart_readyToRead_ind_handler(void*msg);staticU16read_from_uart(U8*pbyBuf,U16wLenMax,UART_PORThPort,module_typehOwner);staticU8write_to_uart(U8*pbyBuf,U16wLenBuf,UART_PORThPort,module_typehOwner);staticvoidexit_uart();staticvoidstart_uart_echo(void);staticvoiduart_echo_process(void);staticvoidstop_uart_echo(void);MTK上位机通过串口发送指令操作手机2/8//睡眠模式句柄statickal_uint8ghSleepMode;//我们要用到的串口之前的占用者staticmodule_typegnOrigUartOwner;statickal_boolgbUartInitialized=KAL_FALSE;statickal_boolgbUartEchoStarted=KAL_FALSE;staticU16gwLenUartBuffer=0;staticU8gabyUartBuffer[MAX_ECHO_PACKET_LEN];staticvoidinit_uart(void){if(gbUartInitialized){return;}ghSleepMode=L1SM_GetHandle();//禁止休眠,休眠后串口收发会有问题//问题:如何做到串口唤醒?FIXMEL1SM_SleepDisable(ghSleepMode);//记录我们要用的串口的当前占有者gnOrigUartOwner=UART_GetOwnerID(HELLO_WORLD_UART_PORT);//下面我们申明要占用这个串口了UART_SetOwner(HELLO_WORLD_UART_PORT,MOD_HELLO_WORLD);//以上对串口占用的申明,我理解更多是一种编程者之间的约定//当发现串口的占用者不是本程序所属模块时,说明我们申明占用之后//又有其他模块申明占用同一个串口,此时如果收到数据应不予处理//当然,也有可能同一模块的其他程序申明占用同一串口//这需要在设计应用时统一协调,避免数据发生混乱//设置波特率,缺省的起停位和校验为:8,n,1,即8个数据位,1个停止位,无校验UART_SetBaudRate(HELLO_WORLD_UART_PORT,UART_BAUD_115200,MOD_HELLO_WORLD);//其他串口设定(如起停位、校验等)使用函数UART_ReadDCBConfig和UART_SetDCBConfig//详细参数见结构体UARTDCBStruct//注册一个事件钩子函数,当串口(任何)有数据到达时,我们的钩子函数将被调用//注意,同一种事件同时只能注册一个钩子函数,因此://如果在我们的程序处理串口的同时还有其他程序要读取和处理(任何)串口数据,//就必须由当前的钩子函数代为处理//实际上我觉得系统底层可以改一下,改成Windows钩子的方式,可以挂多个,能够依次调用或跳过SetProtocolEventHandler(mmi_HelloWorld_uart_readyToRead_ind_handler,MSG_ID_UART_READY_TO_READ_IND);gbUartInitialized=KAL_TRUE;}staticU16read_from_uart(U8*pbyBuf,U16wLenMax,UART_PORThPort,module_typehOwner)MTK上位机通过串口发送指令操作手机3/8{U16wLenAvail;U16wLenRead;U16wLenRet=0;U8byStatus=0;//收取数据,超出最大包长的数据将简单丢弃,这一层需要具体的应用协议做相应处理while((wLenAvail=UART_GetBytesAvail(hPort)0&&wLenRetwLenMax)){if(wLenAvail+wLenRetwLenMax){wLenAvail=wLenMax-wLenRet;}wLenRead=UART_GetBytes(hPort,(kal_uint8*)(pbyBuf+wLenRet),(kal_uint16)wLenAvail,&byStatus,hOwner);wLenRet+=wLenRead;}//读完之后,清除接收BufferUART_ClrRxBuffer(hPort,hOwner);returnwLenRet;}staticU8write_to_uart(U8*pbyBuf,U16wLenBuf,UART_PORThPort,module_typehOwner){U16wSent=0;U8bRet=FALSE;//发送前清FIFO和Buffer,注意:这一步必须做,否则收发会有问题UART_Purge(hPort,RX_BUF,hOwner);//清除设备输入FIFOUART_Purge(hPort,TX_BUF,hOwner);//清除设备输出FIFOUART_ClrTxBuffer(hPort,hOwner);//清除发送BufferUART_ClrRxBuffer(hPort,hOwner);//清除接收BufferwSent=UART_PutBytes(hPort,(kal_uint8*)pbyBuf,(kal_uint16)wLenBuf,hOwner);if(wSent==wLenBuf){bRet=TRUE;}returnbRet;}staticvoidexit_uart(){if(gbUartInitialized){//恢复成原有的端口占用者MTK上位机通过串口发送指令操作手机4/8UART_SetOwner(HELLO_WORLD_UART_PORT,(kal_uint8)gnOrigUartOwner);//允许休眠L1SM_SleepEnable(ghSleepMode);gbUartInitialized=KAL_FALSE;}}staticvoidmmi_HelloWorld_uart_readyToRead_ind_handler(void*msg){uart_ready_to_read_ind_struct*uart_rtr_ind=(uart_ready_to_read_ind_struct*)msg;//检查一下端口以及所有者信息,不匹配的数据略过//注意,作为例子程序,我们只是查看和处理我们关心的数据//其他与此同时需要监听和处理串口数据的程序,须由相关的代码完成代理的工作if(KAL_FALSE==gbUartEchoStarted||HELLO_WORLD_UART_PORT!=uart_rtr_ind-port||MOD_HELLO_WORLD!=UART_GetOwnerID(uart_rtr_ind-port)){//如果底层能做成钩子链,这里就可以调用钩子链的下一个钩子了return;}gwLenUartBuffer=read_from_uart(gabyUartBuffer,sizeof(gabyUartBuffer),HELLO_WORLD_UART_PORT,MOD_HELLO_WORLD);//呼叫数据处理部分uart_echo_process();}staticvoidstart_uart_echo(void){S8strHello[]=HelloWorldUartEchoExampleStarted!\r\n;if(gbUartEchoStarted){return;}init_uart();write_to_uart((kal_uint8*)strHello,(kal_uint16)strlen(strHello),HELLO_WORLD_UART_PORT,MOD_HELLO_WORLD);gbUartEchoStarted=KAL_TRUE;SetKeyHandler(stop_uart_echo,KEY_LSK,KEY_EVENT_UP);}voidmmi_sndrec_send_record_req(void);voidmmi_sndrec_stop_record(void);MTK上位机通过串口发送指令操作手机5/8voidmmi_sndrec_entry_edit_name(void);voidmmi_sndrec_entry_rename_option(void);voidmmi_sndrec_entry_save(void);externvoidMakeCall(PS8strNumber);externvoidEntryScrNotifyCallAborted(void);voidmake_call_test(void){S8numb[6]=10086;U16newnumb[6];memset(newnumb,0,sizeof(
本文标题:MTK上位机通过串口发送指令操作手机
链接地址:https://www.777doc.com/doc-5269204 .html