micropython mp对象和c类型的转换

在基于micropython进行底层c语言的扩展的时候,有时候会碰到需要把python的输入对象最终转换成c层面的数组。今天正好用到这个功能,测试成功,特此记录下来以备之后还会用到。

首先介绍一下我用的最多的两个转换:

一、把mp字符串转换成c的char *

STATIC mp_obj_t modevent_register(mp_obj_t arg)
{
    const char *eventName=mp_obj_str_get_str(arg);
    return mp_obj_new_int(1);
}

如上面的代码,这个用起来就比较简单,arg就是对应python对应的函数参数,c中只需要调用mp_obj_str_get_str(arg)就可以返回char *类型的指针。

二、把mp整型转成成c类型的int类型

STATIC mp_obj_t modevent_consumer_register(mp_obj_t arg)
{
    int eventId=mp_obj_get_int(arg); 
    return mp_obj_new_int(1); 
}

如上面这段代码所示,这里arg传递进来的是一个mp 整型的对象,是不能直接当做c层面的int类型操作的,所以需要进行一道转换。操作很简单,只需要调用mp_obj_get_int(arg);返回的就是c 中的int类型

下面我再介绍下相对复杂一点的,mp对象到c字符串的转换

还是先看一小段示例代码:

STATIC mp_obj_t modcsound_setValue(mp_obj_t arg)
{
    uint8_t *pbuf=NULL;
    mp_buffer_info_t bufinfo;
    if (mp_get_buffer(arg, &bufinfo, MP_BUFFER_RW)) 
    {
        pbuf=(uint8_t *)bufinfo.buf;
        printf("---------%d-----%d------\r\n",bufinfo.len,pbuf[2]);
    }
    return mp_const_none;
}

分析下这段代码,传递进来的同样是mp对象arg,定义了一个mp_buffer_info_t 类型的结构体,主要用他来存放我们转换后的数据。然后调用mp_get_buffer() ,该函数可以从bytearray类型的mp对象中提取出来mp_buffer_info_t 。这里有一点需要注意,就是传递进来的arg必须是bytestring/bytearray这两种类型。然后我们用pbuf指向bufinfo.buf同时加上类型转换(原来是void *类型的)。pbuf就相当于c的数组指针了,bufinfo.len就是数组的长度。

最后在还有一种把c层面的多个数据,通过元组类型返回到python层面:

STATIC mp_obj_t modinterface_eventRead(mp_obj_t arg)
{   
    mp_obj_t param[4];
    neventStruct nes;
    uint8_t id=mp_obj_get_int(arg);
    int result=py_eventRead(id,&nes);
    param[0]=mp_obj_new_int(-1);
    param[1]=mp_obj_new_int(nes.stamp);
    param[2]=mp_obj_new_int(nes.data);
    param[3]=mp_obj_new_str((const char*)nes.buf,nes.buflen);
    return mp_obj_new_tuple(4,param);  //返回python 的tuple类型数据  
}
STATIC const MP_DEFINE_CONST_FUN_OBJ_1(modinterface_obj_eventRead,modinterface_eventRead);

这段代码大体思路讲一下,先定义一个mp对象的数组,大小为4。然后根据自己的需要往数组每个元素里面进行填充内容,每个元素可以放不同的mp类型,(python的tuple是可以把不同类型放一起的)最后我们返回一个新创建的tuple类型mp_obj_new_tuple(4,param);  当然也可以返回list类型的,就是把tuple替换成list。

micropython mp对象和c类型的转换


转载请注明转自电子创客营:micropython mp对象和c类型的转换! 了解我们点击这里
喜欢 (8)or分享 (0)
电子创客营
关于作者:

您必须 登录 才能发表评论!