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

来源:互联网 发布:神经网络数据归一化 编辑:程序博客网 时间:2024/04/29 23:19

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交流了。它离真正的小黄鸡差了十万八千里,就叫它小小小黄鸡吧!

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

原创粉丝点击