MTK之Uart篇

注:本人博文整理至CSDN以方便查阅,源博文位于EDN


在MMI层中设置如下钩子来响应UART的READY  TO  READ消息,这时AT指令无效,直接发往MMI层。


原因:(MSG_ID_UART_READY_TO_READ_IND代号①


① 是属于驱动层的消息。通过串口发送AT指令的过程为MOD_DRV_HISR->MOD_TST_READER,由于MMI层截获了①这个消息,因此先响应MMI层的钩子函数,如果在读取UART的buffer后将其清空,MOD_TST_READER自然得不到AT指令,因此无法做出任何的AT响应。值得注意的是,所有的串口在接到字符后响应的都是消息①,因此在读取的时候需要判断是否是来自所需要串口的信息。


如果串口设置正确,通讯正常,使能串口后将接收缓存清空,那么每次接收到6个字符后便会发出消息①。


打开串口:

⑴禁止休眠

⑵设置MSG_ID_UART_READY_TO_READ_IND消息的钩子函数(响应函数)

⑶将串口所属MOD切换至将要使用的MOD(UART_GetOwnerID,UART_SetOwner)

⑷设置串口参数,波特率等(UART_SetDCBConfig)

⑸清空对应串口的接收Buffer(UART_ClrRxBuffer)


读取串口信息

用到的函数,UART_GetBytesAvail,UART_GetBytes

读完之后记得将接收Buffer清空UART_ClrRxBuffer


向串口写信息

⑴清空设备输入、输出FIFO(UART_Purge)

⑵清空发送、接收Buffer(UART_ClrTxBuffer,UART_ClrRxBuffer)

⑶写入数据UART_PutBytes


关闭串口

将所使用的串口MOD设置为原来的MOD

使能睡眠


以下是摘自mtk 旋风001 中的示例程序


#define CARDPAY_DA_UART                uart_port1
#define CARDPAY_DA_MAX_LEN        255
#define MOD_CARDPAY                        MOD_MMI


U8 gDAbuffer[CARDPAY_DA_MAX_LEN];
U16 gDAbuflen;


extern kal_uint8 CardPaySmHandle;
extern void HuayuRFIDHardInit(void);
extern void HuayuRFIDHardOff(void);


void CardPayDAUartInit(void)
{
#ifdef MMI_ON_HARDWARE_P
        /* UART init */
        UART_SetOwner(CARDPAY_DA_UART, MOD_CARDPAY);
        UART_SetBaudRate(CARDPAY_DA_UART, UART_BAUD_57600, MOD_CARDPAY);
        L1SM_SleepDisable(CardPaySmHandle);
#endif
        SetProtocolEventHandler(CardPayDAUartHandler, MSG_ID_UART_READY_TO_READ_IND);
}


U16 CardPayDAUartRead(U8 *buf, U16 maxlen, UART_PORT port, module_type ownerid)
{
        U8 status = 0;
        U16 avail;
        U16 retlen = 0, readlen;


#ifdef MMI_ON_HARDWARE_P
        while ((avail = UART_GetBytesAvail(port) && retlen <= maxlen) > 0)
        {
                if (avail + retlen > maxlen)
                        avail = maxlen - retlen;


                readlen = UART_GetBytes(port, (kal_uint8 *)(buf+retlen), (kal_uint16)avail, &status, ownerid);
                retlen +=  readlen;
        }


        //UART_ClrTxBuffer(port, ownerid);
        UART_ClrRxBuffer(port, ownerid);
#endif


        return retlen;
}


U8 CardPayDAUartWrite(U8 *buf, U16 buflen, UART_PORT port, module_type ownerid)
{
        U8 ret = FALSE;
        U16 sent;
        module_type UART_Owner = 0;


        sent = 0;


#ifdef MMI_ON_HARDWARE_P
        UART_Purge(port, RX_BUF, ownerid);
        UART_Purge(port, TX_BUF, ownerid);
        UART_ClrTxBuffer(port, ownerid);
        UART_ClrRxBuffer(port, ownerid);


        sent = UART_PutBytes(port, (kal_uint8 *)buf, (kal_uint16)buflen, ownerid);
#endif


        if (sent == buflen)
                ret = TRUE;


        return ret ;
}


void CardPayDAUartHandler(void *msg)
{
#ifdef MMI_ON_HARDWARE_P
        uart_ready_to_read_ind_struct *tmp = (uart_ready_to_read_ind_struct *)msg;


    if (UART_GetOwnerID(tmp->port) != MOD_CARDPAY)
                return ;


        if (tmp->port != CARDPAY_DA_UART)
                return ;


        gDAbuflen = CardPayDAUartRead(gDAbuffer, CARDPAY_DA_MAX_LEN, CARDPAY_DA_UART, MOD_CARDPAY);


        if (CardPayDAUartReadDone())
                CardPayDADataProcess();
#endif
}


U8 CardPayDAUartReadDone(void)
{
        return 1;
}


void CardPayDADataProcess(void)
{
        if (gDAbuflen > 0)


        {
                //CardPayDAUartWrite(gDAbuffer, gDAbuflen, CARDPAY_DA_UART, MOD_CARDPAY);
                // update display
                CardPayDAUpdateInfo(gDAbuffer, gDAbuflen);
                
        }
        CARDPAY_DEBUG_HEX(gDAbuffer, gDAbuflen);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值