【露】UK大冒险之——变身小小小黄鸡

本文记录了使用C语言和Java程序实现与UK设备交互的过程,包括编写C程序使其能够响应用户的输入并返回预设的随机回复,以及通过Java程序控制UK设备执行C程序。解决了调试困难、乱码和内存管理等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UK啊UK,想说爱你不容易!和你说句话费老大劲了~

这两天的工作就是和UK进行联系,想来想去,把UK作为唠嗑儿的对象再合适不过了,没错儿,我就是想把它当小黄鸡使唤,能陪人聊天的UK多贴心哪!

凡是都是想起来简单做起来难,让UK变身小黄鸡真是费了我好大的功夫,且不说C语言的函数名儿都得用内置的新函数,就连正常C的功能也不一定能如你所愿,这就是硬件开发和软件的开发的最大的区别吧!短短的几行程序,其中出现了多少的狗血问题我就不说了,单单是调试的时候没办法知道变量的值就让人很憋屈,想用printf把值输出来都不行,哪有控制台啊!以后达叔就要和它相依为命了,好可怜啊可怜

一顿折腾之后有了最后的C程序

#include"ses_v3.h"
#include"string.h"

main()
{
int ret = 0,i=0;
char in;
char out[80]="";
char test[30]="";
char news[10][50] = {	"干掉熊猫,我就是国宝!",
                      	"不吃饱哪有力气减肥啊?",
                      	"我喜欢你离我远一点!",
			"人又不聪明,还学别人秃顶。",
 			"你喜欢我一下会死啊? " ,
			"我能抵抗一切,除了诱惑",
 			"跌倒了,爬起来再哭",
 			"还没来得及表白,愚人节就过去了。",
			"格式化自己,就是为了删除你。",
 			"天哪,我的衣服又瘦了!"};

char message[40]="客官,你总得说点儿什么吧";//不说话时UK返回的语句
ret = _mem_copy(&in, (char*)&pbInBuff,1);
//_set_response(2,(BYTE *)&i);
if(in==NULL)
{
	_set_response(strlen(message),message);
	_exit();
}

/*随机选择一个句子,复制到输出数组中*/
_rand(1,(BYTE *)&i);
i=i%10;
ret = _mem_copy(out,news[i],strlen(news[i]));

 if(ret != 	SES_SUCCESS)
 {
   		_set_response(strlen(message),message);
   _exit();
 }
/*将数据内容传出*/
_set_response(strlen(out),(BYTE *)out);

/*终止程序*/
_exit();
return 0;
}
好在开发商提供了模拟器,可以模拟执行的结果,模拟器界面如下

执行完之后会返回结果


接下来是java程序,有例子就好办,经过修改后的程序为

import com.sun.jna.*;
import java.util.Date;
import com.sun.jna.Library;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.*;
import java.io.*;
public class Sense4Demo
{
    public Sense4Demo()
    {
    }
    public static void main(String agrs[])
    {
        Sense4Lib lib = Sense4Lib.instance;
        Sense4Lib.Sense4_CONTEXT ctx[] = null;
        IntByReference pSize = new IntByReference(0);
        IntByReference fsize = new IntByReference(0);

        byte old_pin [] ={49,50,51,52,53,54,55,56};
        byte new_pin [] ={56,55,54,53,52,51,50,49};
        byte dev_pin [] ={49,50,51,52,53,54,55,56,49,50,51,52,53,54,55,56,49,50,51,52,53,54,55,56};
        byte []sn=new byte[8];
        byte device_id []={83,69,78,83,69,101,108};
        byte para1 []={01};
	byte para2 []={00};
	byte []out = new byte[60];
        int ret=0;
        
        // 列举锁,第一次获取锁信息列表大小pSize,
        lib.S4Enum(null,pSize);
        // 根据列表大小,分配本地空间
        ctx = new Sense4Lib.Sense4_CONTEXT[pSize.getValue()/92];
        for (int i = 0; i < pSize.getValue()/92; i++)
        	ctx[i] = new Sense4Lib.Sense4_CONTEXT();
        // 列举锁,第二次将信息填入本地分配的列表ctx[0]
        ret=lib.S4Enum(ctx[0],pSize);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("enum device failed! 0x%08x\n", ret);
        }
        else
            System.out.println("enum device successed! ");
	// 打开锁
        ret = lib.S4Open(ctx[0]);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("open device failed! 0x%08x\n", ret);
        }
        else
            System.out.println("open device successed! ");
	// 获取序列号
        ret = lib.S4Control(ctx[0],lib.S4_GET_SERIAL_NUMBER,null,0,sn,8,pSize);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("get serial number failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("get serial number successed! ");
	// 验证管理员PIN
        ret = lib.S4VerifyPin(ctx[0],dev_pin,24,Sense4Lib.S4_DEV_PIN);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("verify pin failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("verify pin successed! ");
	// 擦除目录
        ret=lib.S4EraseDir(ctx[0],null);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("erase dir failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("erase dir successed! ");
	// 重新建立目录
        Sense4Lib.S4CREATEDIRINFO dir_info =new Sense4Lib.S4CREATEDIRINFO();
        dir_info.dwS4CreateDirInfoSize = 272;//sizeof(Sense4Lib.S4CREATEDIRINFO);
        dir_info.szAtr = device_id;
        ret =lib.S4CreateDirEx(ctx[0],"\\",0,Sense4Lib.S4_CREATE_ROOT_DIR,dir_info);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("create root dir failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("create root dir successed! ");
	// 定位锁内错做目录
        ret=lib.S4ChangeDir(ctx[0],"\\");
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("change dir failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("change dir successed! ");
	// 修改用户PIN
        ret = lib.S4ChangePin(ctx[0],old_pin,8,new_pin,8,Sense4Lib.S4_USER_PIN);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("change pin failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("change pin successed! ");
        // 还原用户PIN
        ret = lib.S4ChangePin(ctx[0],new_pin,8,old_pin,8,Sense4Lib.S4_USER_PIN);
	// 验证管理员PIN
        ret = lib.S4VerifyPin(ctx[0],dev_pin,24,Sense4Lib.S4_DEV_PIN);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("verify pin failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("verify pin successed! ");
	// 写入文件,需要管理员权限
        ret = lib.PS4WriteFile(ctx[0],"0001","test.hex",fsize,Sense4Lib.S4_CREATE_NEW,Sense4Lib.S4_HEX_FILE,pSize);
        if(ret!=lib.S4_SUCCESS)
        {
            System.out.printf("write hex file failed! 0x%08x\n", ret);
            lib.S4Close(ctx[0]);
        }
        else
            System.out.println("write hex file successed! ");

	// 验证用户PIN
       ret = lib.S4VerifyPin(ctx[0],old_pin,8,Sense4Lib.S4_USER_PIN);
       if(ret!=lib.S4_SUCCESS)
       {
           System.out.printf("verify pin failed! 0x%08x\n", ret);
           lib.S4Close(ctx[0]);
       }
       else
           System.out.println("verify pin successed! ");
	// 执行锁内程序
	
	   while(true)
	   {
			String input = new String();
			System.out.print("你: ");
			try
			{
				BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				input = br.readLine();
				//System.out.println(input);
			}
			catch(IOException ex)
			{
				ex.printStackTrace();
			}
			//System.out.println("你: "string);
			if(input.equals(""))
			{
				ret =lib.S4Execute(ctx[0],"0001",para2,1,out,50,pSize);
				//System.out.println("是空");
			}
			else
			{
				ret =lib.S4Execute(ctx[0],"0001",para1,1,out,60,pSize);
				//System.out.println("不是空");
			}
			if(ret!=lib.S4_SUCCESS)
			{
				System.out.printf("execute hex file failed! 0x%08x\n", ret);
				lib.S4Close(ctx[0]);
			}
			else
			{
				//System.out.println("execute hex file successed! ");
				String string = new String(out);
				System.out.println("UK: "+string);
				   for(int i=0;i<60;i++)
				{
					out[i]=0;
				}
			}
		}
    }
}
开始运行的结果如下

用户输入句子时,UK会从数组中随机挑出一句话来回答,如果什么都不输入,UK会回答“客官,你总得说点儿什么吧“

看上图发现,回答内容有乱码,下一句如果比上一句短,则上一句的超出内容也会显示出来,看着相当别扭。

开始我以为是UK的程序有问题,改了很多次后还是出现问题,经过仔细思考后,发现是因为java程序的接受数组没有清0导致的(上方程序加粗部分)

修改后结果如下

还有最后一个问题,就是当说很多句话以后,UK会执行错误,提示外部指针引用错误(0x00200000),这个思考后也不太理解为什么?就交给达叔来处理吧!

总算是能够和聊天了,虽然说不了几句,而且反反复复就那么几句话,但总之是成功和UK交流了。它离真正的小黄鸡差了十万八千里,就叫它小小小黄鸡吧!

希望达叔能尽快给他升级!~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值