micropython mp对象和c类型的转换
在基于micropython进行底层c语言的扩展的时候,有时候会碰到需要把python的输入对象最终转换成c层面的数组。今天正好用到这个功能,测试成功,特此记录下来以备之后还会用到。
首先介绍一下我用的最多的两个转换:
一、把mp字符串转换成c的char *
1 2 3 4 5  | 
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类型
1 2 3 4 5  | 
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字符串的转换
还是先看一小段示例代码:
1 2 3 4 5 6 7 8 9 10 11  | 
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层面:
1 2 3 4 5 6 7 8 9 10 11 12 13  | 
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。




太强了