LUA调用有数组参数的C函数

LUA发送一包数据到串口中,发送前需要校验,校验在C完成,所以要将一个数组传递到C那边,代码如下:

1. C代码的校验函数如下

//--- lua中以数组传递参数
static int calc_chksum(lua_State *L)
{
 	int 	i;
	int 	DatLen;
	unsigned char *DatInf;
	unsigned short crc;
	 
	if(!lua_istable(L, 1)){					//判断第一个参数是否为表,否则退出
        lua_pushnil(L);
        return -1;
    }
	DatLen = luaL_checknumber(L,2);			//获取第二个参数,数据长度
	DatInf =(unsigned char *)malloc(DatLen);
	for(i=1; i<=DatLen; i++){
		lua_rawgeti(L, 1, i);
		DatInf[i-1] = lua_tointeger(L, -1);
		lua_pop(L, 1);						//把上一个内容的出栈
	}
	crc = CalcChkSum(DatInf, DatLen);		//计算校验值
	lua_pushinteger(L,(crc>>8)&0xff);		//校验值高位压栈
	lua_pushinteger(L,(crc)&0xff);			//校验值低位压栈
	free(DatInf);
    return 2;   							//返回参数个数
}

2. LUA代码如下

function collection_data(if_id, ipaddr, port, devaddr)                                                                                                                                                                          
                                                                                                                                                                                                                                
        print("if_id:", if_id);                                                                                                                                                                                                 
        print("ipaddr:", ipaddr);                                                                                                                                                                                               
        print("ip port:", port);                                                                                                                                                                                                
        print("dev addr", devaddr);                                                                                                                                                                                             
                                                                                                                                                                                                                                
        cmd = {devaddr, 0x04, 0x00, 0x00, 0x00, 0x02};                                                                                                                                                                          
        crc1, crc2  = dev_lib.calc_chksum(cmd, 6);          //调用C函数完成数组的计算得到CRC的高低字节                                                                                                                                                                           
        cmd[7] = crc1;                                                                                                                                                                                                          
        cmd[8] = crc2;                                                                                                                                                                                                          
        dev_lib.write_data(if_id, cmd, 8);                  //最后通过接口发送出去                                                                                                                                                                                  
                                                                                                                                                                                                                                
end            

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄大刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值