6 C脚本函数


6.1 动态库中定义的方法接口以及说明

6.2 控件绑定函数返回值限制

6.3 前提

6.4 调用I2C读写

实现原理:C函数脚本调用C编写的dll动态库建立通信,进行I2C读写

注意:所有的参数在传递到C脚本时都会是字符串类型,所以在使用参数的时候,对于不同的参数要根据它们的类型进行类型转换,否则,会导致程序加载超时,程序无响应。

6.5 C脚本函数编写说明

6.6 样例

注意:样例只作为编写C函数格式参考,并不能直接使用

当需要进行I2C读写时,首先需要自定义一个头文件来定义调用方法,头文件参考定义样例如下:

#define CHIP_PORT atoi(argv[3]) //在DUT网络连接时,argv[3]定义了I2C port

#define CHIP_ADDR atoi(argv[5])//在DUT网络连接时,argv[5]定义了设备地址

#define USB_ADDR atoi(argv[2]) //在USB连接模式时,argv[2]定义了USB的设备地址

#define USB_SPEED atoi(argv[1]) //在USB连接模式时,argv[1]定义了USB的速率

//g_connect标识是Sockect连接还是USB连接,g_connect 等于0时,为USB连接,g_connect非0时,为Sockect连接

#define INIT_CONNECT if (g_connect) {\

InitSock(argv[1],atoi(argv[2])); \

}else{\

if(USBIO_OpenDevice(0) == INVALID_HANDLE_VALUE ){ \

printf("error=%s,return=%d","err openerror,failed",-1); \

return; \

} \

USBIO_SetStream(0,USB_SPEED);\

}

#define DEINIT_CONNECT if (g_connect) {\

DeinitSock();\

}else{\

USBIO_CloseDevice(0);\

}

#define CHIP_MRD(REG_ADDR, P_RBUF, RLEN) if (g_connect) { ReadregMulti((CHIP_PORT), (CHIP_ADDR), (REG_ADDR), 1, ((char *)(P_RBUF)), (RLEN)); \

} else {\

unsigned char P_WBUF[2];\

P_WBUF[0] = USB_ADDR;\

P_WBUF[1] = REG_ADDR;\

USBIO_StreamI2C(0,2,(PVOID)pSend,RLEN,(PVOID)(P_RBUF));\

}

#define CHIP_MWR(REG_ADDR, P_WBUF, WLEN) if (g_connect) { WriteregMulti((CHIP_PORT), (CHIP_ADDR), (REG_ADDR), 1, ((char *)(P_WBUF)), (WLEN));\

} else {\

unsigned char P_RBUF;\

char *p = (char *)malloc((WLEN)+2);\

char *pw =(char *)(P_WBUF);\

int i = 0;\

p[0]= USB_ADDR;\

p[1]= REG_ADDR;\

for (i=0;i<(WLEN);i++) {\

p[i+2] = pw[i];\

};\

USBIO_StreamI2C(0,2+(WLEN),(PVOID)p,0,(PVOID)(&cRecv));\

}

定义了头文件后,在编写C脚本开头需要引入它,C函数定义的样例如下:

#include "stdio.h"

#include "string.h"

#include 自定义的头文件

#include "USBIOX.H" //必须要引入

extern int g_connect; //这行代码是必须的

int on_line(int argc, char ** argv)

{

INIT_CONNECT;

unsigned char chip_id[4];

unsigned char on_line;

CHIP_MRD(0x6f, &chip_id, 4);

on_line = (chip_id[2]==0x36) && (chip_id[3]==0x31);

if(on_line) {

printf("error=%s,return=%d","ok",1); }

else {

printf("error=%s,return=%d","ok",0); }

DEINIT_CONNECT;

}

//内部私有方法,使用‘static’来标识

static int demo_m2( int argc, char ** argv )

{

int i = 0;

printf("demo_m2........");

return 0;

}

//只是用来被外部调用,而不在工具UI函数列表中显示,此时使用‘inner_’来标识

int inner_compile( int argc, char ** argv )

{

int i = 0;

printf("I'm inner function");

return 0;

}