资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
MTK 上位机通过串口发送指令操作手机 1 / 8/*测试的时候是在 idleapp.c 中测试的,在函数 IdleSetLRKey 中通过 SetKeyHandler(start_uart_echo, KEY_LEFT_ARROW,KEY_EVENT_UP);来启动串口,然后就可以在上位机中通过串口调试助手发送指令操作 MTK 手机了*/ / #include “stdC.h“#include “MMI_Features.h“ /* 编译开关会出现在这个由 make update 生成的文件里面 */ #include “L4Dr.h“ #include “L4Dr1.h“#include “AllAppGprot.h“ #include “FrameworkStruct.h“ #include “GlobalConstants.h“ #include “EventsGprot.h“ #include “mmiappfnptrs.h“ #include “HistoryGprot.h“#include “MainMenuDef.h“#include “wgui_categories.h“#include “Unicodexdcl.h“ #include “gui_data_types.h“#include “Uart_sw.h“ #include “SettingProfile.h“/ 我们要用到的串口, uart_port1 是枚举型数值,usb 串口的编号 #defineHELLO_WORLD_UART_PORT uart_port1/ 手机接 USB 下载线的地方 / 定义我们的应用所属系统的哪一个模块 / 这里是 MMI 模块,实际上我更愿意称 MMI 为一个子系统,将我们的应用称为模块 #defineMOD_HELLO_WORLDMOD_MMI/ 数据接收 Buffer 大小 #defineMAX_ECHO_PACKET_LEN128/ 外部函数申明,没有对应头文件,手动加吧 extern module_type UART_GetOwnerID(UART_PORT port); extern void UART_ClrTxBuffer(UART_PORT port, module_type ownerid); extern void UART_ClrRxBuffer(UART_PORT port, module_type ownerid); extern void playRequestedTone(ALL_TONE_ENUM playtone);/ 本程序内部使用的函数申明 static void init_uart(void); static void mmi_HelloWorld_uart_readyToRead_ind_handler(void *msg); static U16 read_from_uart(U8 *pbyBuf, U16 wLenMax, UART_PORT hPort, module_type hOwner); static U8 write_to_uart(U8 *pbyBuf, U16 wLenBuf, UART_PORT hPort, module_type hOwner); static void exit_uart(); static void start_uart_echo(void); static void uart_echo_process(void); static void stop_uart_echo(void);MTK 上位机通过串口发送指令操作手机 2 / 8/ 睡眠模式句柄 static kal_uint8ghSleepMode;/ 我们要用到的串口之前的占用者 static module_typegnOrigUartOwner; static kal_boolgbUartInitialized = KAL_FALSE; static kal_boolgbUartEchoStarted = KAL_FALSE; static U16gwLenUartBuffer = 0; static U8gabyUartBufferMAX_ECHO_PACKET_LEN;static void init_uart(void) if(gbUartInitialized) return; ghSleepMode = L1SM_GetHandle();/ 禁止休眠,休眠后串口收发会有问题 / 问题:如何做到串口唤醒? FIXME L1SM_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; static U16 read_from_uart(U8 *pbyBuf, U16 wLenMax, UART_PORT hPort, module_type hOwner)MTK 上位机通过串口发送指令操作手机 3 / 8 U16 wLenAvail; U16 wLenRead; U16 wLenRet = 0; U8 byStatus = 0;/ 收取数据,超出最大包长的数据将简单丢弃,这一层需要具体的应用协议做相应处理 while( (wLenAvail = UART_GetBytesAvail(hPort) 0 wLenRead = UART_GetBytes(hPort, (kal_uint8 *)(pbyBuf + wLenRet), (kal_uint16)wLenAvail, wLenRet += wLenRead; / 读完之后,清除接收 Buffer UART_ClrRxBuffer(hPort, hOwner);return wLenRet; static U8 write_to_uart(U8 *pbyBuf, U16 wLenBuf, UART_PORT hPort, module_type hOwner) U16 wSent= 0; U8 bRet = FALSE;/ 发送前清 FIFO 和 Buffer,注意:这一步必须做,否则收发会有问题 UART_Purge(hPort, RX_BUF, hOwner); / 清除设备输入 FIFO UART_Purge(hPort, TX_BUF, hOwner); / 清除设备输出 FIFO UART_ClrTxBuffer(hPort, hOwner);/ 清除发送 Buffer UART_ClrRxBuffer(hPort, hOwner);/ 清除接收 BufferwSent = UART_PutBytes(hPort, (kal_uint8 *)pbyBuf, (kal_uint16)wLenBuf, hOwner);if (wSent = wLenBuf) bRet = TRUE; return bRet ; static void exit_uart() if(gbUartInitialized) / 恢复成原有的端口占用者MTK 上位机通过串口发送指令操作手机 4 / 8UART_SetOwner(HELLO_WORLD_UART_PORT, (kal_uint8) gnOrigUartOwner);/ 允许休眠 L1SM_SleepEnable(ghSleepMode);gbUartInitialized = KAL_FALSE; static void mmi_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(); static void start_uart_echo(void) S8 strHello = “Hello World Uart Echo Example Started!rn“;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_U
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号