Author Archives: jkl

梦游记

Arduino软串口的使用

Arduino Uno自带一个串口,也就是管脚1、2,“硬串口”,IDE upload代码、使用串口监视器调试程序,用到的都是这个串口,那么,如果你还需要用串口连接其他设备时,应该怎么办呢?
为了不应现调试程序,这里需要用到“软串口”,也就是将其他数字管脚当成串口使用~~の,难道要按TTL串口协议解析串口数据不成?
到是没有这么复杂,Arduino已经自带SoftwareSerial库,完成了对串口逻辑的封装。以下代码是串口读取VAMLED电压模块的逻辑,咱们以此为例来看看软串口是怎么用的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <SoftwareSerial.h>
 
SoftwareSerial EVSerial(2, 3); //定义软串口管脚,分别是rx tx 
 
void setup (){
  EVSerial.begin(9600); //波特率
  Serial.begin(9600);
}
 
void loop() {
  if(EVSerial.available() > 0){
    Serial.print(">> ");
    Serial.println(EVSerial.readString());//在串口监视器,打印电压模块传递的电压值
    delay(1000); //每读取一次,延时
    EVSerial.print(0); //向VAMLED模块发送“上报电压”指令
  }
}

以上逻辑,即包含了SoftwareSerial读取和写入的操作,不过实际使用有两个问题:
1. 每模拟一个软串口都要消耗单片机的资源,内存和flash、堆栈等。软串口和硬串口对于发送数据是一样的,但在接收数据时,性能就有差别了,硬串口是支持中断接收数据的,不会影响程序运行的实时性,但是软串口不支持中断,接收串口数据你得去不断轮询,收到的数据还有可能会丢掉
2. 具体到上面这个例子,实际收到的电压值包含乱码,不好解析,具体原因正在研究,等有结果了再更新o(* ̄︶ ̄*)o
———-
转载请注明出处:http://www.jiangkl.com/2022/10/arduino_serial/

浅析schedule与update的关系

schedule是cocos自带的定时器,这里简单试试这玩意的执行情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    onLoad () {
        this.schedule(()=>{
            let now = new Date().getTime();
            console.log('schedule-test, schedule 0.001', now);
        }, 0.001);
        this.schedule(()=>{
            let now = new Date().getTime();
            console.log('schedule-test, schedule  0.01', now);
        }, 0.01);
        this.schedule(()=>{
            let now = new Date().getTime();
            console.log('schedule-test, schedule   0.1', now);
        }, 0.1);
    }
 
    update (dt) {
        let now = new Date().getTime();
        console.log('schedule-test,         update', now);
    }

输出如下:
————
schedule-test, update 1658395521046
schedule-test, schedule 0.001 1658395521047
schedule-test, schedule 0.01 1658395521048
schedule-test, update 1658395521063
schedule-test, schedule 0.001 1658395521064
schedule-test, schedule 0.01 1658395521065
schedule-test, update 1658395521080
schedule-test, schedule 0.001 1658395521081
schedule-test, schedule 0.01 1658395521082
schedule-test, update 1658395521097
schedule-test, schedule 0.001 1658395521098
schedule-test, schedule 0.01 1658395521099
schedule-test, schedule 0.1 1658395521100
schedule-test, update 1658395521113
schedule-test, schedule 0.001 1658395521114
schedule-test, schedule 0.01 1658395521115
。。。。
————
简单总结一下,可以得到下面几个结论:
1. 在cocos的世界里,一“帧”,就是它的最小计时单位,也是schedule的最小调用周期,比帧间隔再小的时间单位,对schedule无效
2. schedule(可能)会在每一帧的update以后,调起定时逻辑
3. 即使定时间隔大于帧间隔,schedule也不能按毫秒级的时间精确调起回调函数(这一点从定时“0.1s”的回调里可以看出,不过上面没贴出出这么多)
嗯,简单来说看,可以把schedule当成低配版setInterval,既然cocos提供了自己的定时器,就尽量少用setInterval和setTimeout吧
————
转载请注明出处:http://www.jiangkl.com/2022/07/cocos_schedule_update

使用图片序列创建cocos帧动画

    需求是制作一个简单的帧动画,图片素材来自一个gif,只有八帧,实现简单的人物动作。做demo时,没找到ccoos的切片工具,便直接用8个图片文件来实现了动画,效果还不错。但是正式项目时,八张图就是八个http请求,会拖慢页面加载速度,于是便回头找cocos做图片切片的方法
    这里要吐槽一个cocos,css有background-position,unity更是自带强大的切片工具,但找了很久,也没找到cocos对应的解决方案~~
    从前天一直拿“cocos 切片”类似的关键字搜索,一直也没找到解决方案~~到是在sprite的sliced浪费了不少时间。。。最后才发现被误导了,这玩意根本不是做图片切片用的,而是做背景图无变形放大用的。。。
    终于,昨天无意间看到一篇文章,提到的cocos的mask组件。。。嗯,就是它了,遮罩
    具体做法也很简单:父节点增加mask组件,然后将图片精灵放在子节点,调整子节点的position属性,就可以实现类似background-position的效果,详细设置见下图

———-
转载请注明出处:http://www.jiangkl.com/2022/06/sequence_animation
————————-
    三天后补充:
    就在我自己拿ps合并了项目里的二十几张小图后,然后呼哧呼哧一顿替换,将项目小图通过前面提得到的mask形式全都全换成了合并后大图,然后继续项目调优。。。然后就看到了cocos高手的调优经验:慎用mask,因为会带来过多的Drawcall。。。调整后的项目,Drawcall是36。。。咕~~(╯﹏╰)b
    同时也在这篇文章里看到了解决小图问题的方案:cocos createor自带“合并图集”的功能。。。
    这就是不好好看教材,直接靠搜代码方案做项目的结果,白费两天时间。。。
    还好上次折腾前,备份了项目。于是直接恢复项目,10分钟不到,就是用“合并图集”完成了减少http请求数的目标——然后打包运行,项目正常!
———-
    反思一下,其实就是没搞清“切图”和“合图”的区别,被自己一知半解的unity经验误导了。。。一直没找到点上
    记得大三时,刚接触汇编语言,有一次作业,需要相似的逻辑,执行10次。虽然当时已经学了c,知道程序里有“循环”可以做这事,可是在简单翻书没找到汇编的“循环”写法以后,下意识以为汇编这种低级语言没有循环,于是手动写了10次代码逻辑。老师看了以后评价:下次作业要执行有个一万次的循环,你要不要也这么写?

cocos碰撞检测的坑–移动太快可能不触发

    下午调试一个cocos射击游戏,未击中时,目标背后的“墙”上会显示一个弹孔。本来以为挺简单的东西,可碰到了一个无厘头的问题,搞了一个小时才解决。
    具体的问题是这样的:子弹和墙的碰撞事件,有时能触发、有时不能触发。于是按照以前的经验,逐个找了下面一个容易出问题的点:
    1. 开启碰撞检查:cc.director.getCollisionManager().enabled = true;
    2. 碰撞检测函数onCollisionEnter加入到碰撞实体的绑定函数
    3. 项目设置里的碰撞分组设置
    4. 碰撞节点出了添加collder,还要至少有一方添加rigidbody
———-
    这几个点都确认了一遍,还是没解决。。。只能瞎搞了
    N种尝试以后,降低子弹速度了,问题不在重现。。。
    于是看出了端倪:游戏过程是每帧间隔的,子弹速度太快,撞击体太小,刚好撞击的过程发生在了两帧之间
    尝试增大撞击体“墙”的“厚度”,问题解决
——————
转载请注明出处:http://www.jiangkl.com/2022/03/cocos_oncollisionenter