问题现象如下图:

最近试玩的MCU比较多,同时各种配套的IDE、烧录调试程序用的也比较多,用惯了VS、JetBrains的我一时感觉无法适应,仿佛回到了十多年前😂,第一个问题就是在高DP显示器的Win10下,这个模糊啊。。。于是稍微研究了下,找到了临时解决方法:
Continue reading…欢迎留言、转载请注明出处
问题现象如下图:
最近试玩的MCU比较多,同时各种配套的IDE、烧录调试程序用的也比较多,用惯了VS、JetBrains的我一时感觉无法适应,仿佛回到了十多年前😂,第一个问题就是在高DP显示器的Win10下,这个模糊啊。。。于是稍微研究了下,找到了临时解决方法:
Continue reading…继之前的Arduino Nano之后,最近又搞了一片国产的W801开发板研究,陆续装上了CDK IDE和W80X SDK v1.00.10后,算是能编译自带的Demo程序了,整个过程对比下来对新手的友好度明显不如Arduino,后者基本上能做到装好IDE后一键部署点灯程序,不过这个MCU功能强大,整个开发板又只要9块9,生态差点就差点吧,要什么自行车!在百度了不少资料,搞明白怎么上传变好的自带demo程序.fls文件后,打开联盛德的Upgrade Tools,打开串口,选好fls文件,点击下载,duang,挂掉了,提示:
Waiting for receive CCC …
CCCC
==
Sync success, W80X
BLE MAC: 286DCDD1495B
WIFI MAC: 286DCDCE3C1B
FID:85,15
Please wait for Erase flash …
CCCC
Erase flash ok.
Try 2000000 baud download file …
Start the download image_0.img
Start the download image_1.img
Download “D:/C-Sky/W80X SDK v1.00.10/bin/w800/w800.fls” fail! Error code: “CAN”
LLLCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
然后就是一直刷CCCCC(后来才知道,这是这个开发板进入等待上传程序的信号,怪!),又试了几次,一样的现象,大概在进度走到30%左右就会fail….
Continue reading…家里三个小米温湿度计2,连着小米智能插座2的蓝牙网关,小巧方便,手机随时查看家里温湿度情况。最近其中一个在更换电池后,出现了奇怪的问题:米家app上能看到设备,并且也显示已连接蓝牙网关,但是温湿度数据就是获取不到,点进设备详情界面也一直没反应,提示“打开蓝牙”,此时如果开启手机蓝牙,会以很慢的速度通过蓝牙连接设备,然后确实可以正常获取到数据,只是整个过程反应很慢,不像之前网关正常时随点随出,同时这样在外出时也看不到这个温湿度计的实时信息了(从米家app的中枢网关界面里也能看到这个温湿度计是连接状态,并且离着不远三格信号满格),后来看了下固件,发现可以升级到最新的“0130”,于是升了下级(这个过程也是特别慢,不知道是不是由于蓝牙传输所致),升级完成后问题依旧!百度搜索了下,发现有人提到可以重置一下试试,然后就进入了今天记录的主题,这个小米温湿度计的重置设计也算是另类了,网上能搜到的重置方法基本都是这样说的:
最近在研究基于Arduino + Si4735 + pu2clr/SI4735的数字收音机,FM功能基本已经ok了,感谢pu2clr开源项目作者 Ricardo Lima Caratti 封装了这么好用的库,电路连接正确的情况下,基本可以秒实现功能!
简单试玩了一段时间后准备挑战下传说中的SSB单边带补丁,结果踩到了一个小坑,使用pu2clr库中的代码:https://github.com/pu2clr/SI4735/blob/master/examples/TOOLS/SI47XX_09_SAVE_SSB_PATCH_EEPROM/SI47XX_09_SAVE_SSB_PATCH_EEPROM.ino,准备将SSB补丁写进AT24C256 eeprom中,结果发现执行代码后,数据写入出现了问题,所有验证过程读回的数据全都是0xFF,patch的name什么的在Arduino IDE的Serial Monitor中看到的也都是乱码,size也都是FF对应的错误数据65535这些…
Continue reading…最近搞了个Arduino研究研究,当积木搭到同时上了旋转编码器和EEPROM(FT24C256兼容AT24C256)时,踩到了一个小坑,在编码器开关触发时进行EEPROM写入操作时会出现卡死情况,特此记录下解决过程:
之前写过一篇基于WSL编译windows版FFmpeg的博文:使用Win10 + WSL编译FFmpeg时的依赖库处理 – https://blog.k-res.net/archives/2771.html,记录了一些基本构建操作和一些问题,但是当时的configure并没有开启很多其他依赖项来激活相关功能,这次要记录的是通过开启openssl的方式,增加如https,rtmps等协议的支持,虽然有WSL的加持,大大简化了windows下编译FFmpeg的复杂度,但到了某些依赖,如这次要说的openssl时,还是有些需要注意的地方的,毕竟WSL的方式实际的本质是在一个同时有linux命令但又能执行windows执行程序的特殊环境下执行构建操作,带来方便的同时也带来了一些特有的麻烦:
Continue reading…上次给退役的一加1刷了lineage-16.0后,本来一直使用的挺好,当个备用怀旧游戏机还挺流畅的,最近拿来做一些安卓调试时突然发现logcat没反应了,AndroidStudio里一片空白,adb设备状态一切正常,尝试adb logcat以及adb shell后logcat,发现会提示“logcat read failure”这个错误,查了半天,尝试了个各种手段,root su进到/system/bin下看logd完好无埙,又看有人说是selinux的问题,ls -Z检查了logd的权限:u:object_r:logd_exec:s0,发现也没问题。然后又以为是装Magisk装的把系统搞坏了,于是有恢复出厂了一次,结果发现错误依旧!最后突然想到之前的系统镜像貌似是不知道哪个瞎八网站上下载的,本来里面就内置了一堆乱起八糟的app,会不会是不靠谱的rom作者把重要功能给改坏了?于是废了半天劲找了个lineage官方的旧版本系统镜像:https://lineageosroms.com/bacon/#installing-lineageos-from-recovery 然后又重刷了一次机,果然,纯原版的镜像是没有问题的,logcat恢复正常了。
在Unity还是4.x 5.x的时代,为了做一些安卓原生功能,如获取电量,wifi信号强度等功能,或者是为了接入某些原生SDK,经常需要制作Unity的Android原生插件,当时基本就是基于Unity的安卓classes.jar制作plugin.jar,然后自定义AndroidManifest.xml,一起放到Unity项目的Assets/Plugins/Android下,然后Build安卓apk即可,简单粗暴。最近又有了做安卓插件的需求,这次换上了2020版的Unity,本以为还是当年熟悉的操作,没成想来了个大人,时代变了,踩了不少新坑:
首先,当年好像还是用Eclipse做Android开发,现在早就是Android Studio的天下了,我用的版本是:Chipmunk 2021.2.1 Patch 2,按着网上找到的教程(对,很久没用了,都快忘了怎么建项目了),创建了Android Library项目,又从Unity的“D:\Program Files\Unity\Hub\Editor\2020.3.30f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes”位置,拿到了熟悉的classes.jar,注意这里有一些变量,比如mono,现在还有了il2cpp的选择,Release对应还有Debug,根据实际情况进行选择吧。然后,随便写了几个简单的静态方法,Unity C#里调用了下,nice,没有问题,于是开始进行下一步,自定义入口activity,然后就开始踩坑了:
Continue reading…网上找到的大部分都是旧API,新版OpenSSL推荐使用EVP系列接口,在此记录下EVP方式的MD5哈希实现代码:
#include "openssl/conf.h"
#include "openssl/evp.h"
#include "openssl/err.h"
#include "openssl/engine.h"
void handle_errors()
{
ERR_print_errors_fp(stderr);
abort();
}
std::string md5_str(const std::string & str)
{
const auto * md = EVP_get_digestbyname("MD5");
if (nullptr == md)
{
std::cerr << "Failed to EVP_get_digestbyname MD5!" << std::endl;
return "";
}
unsigned char buf[EVP_MAX_MD_SIZE] = {};
unsigned int olen = EVP_MAX_MD_SIZE;
EVP_MD_CTX * ctx = EVP_MD_CTX_new();
if (nullptr == ctx)
{
std::cerr << "Failed to EVP_MD_CTX_new!" << std::endl;
return "";
}
if (1 != EVP_DigestInit(ctx, md))
{
handle_errors();
return "";
}
if (1 != EVP_DigestUpdate(ctx, str.data(), str.length()))
{
handle_errors();
return "";
}
if (1 != EVP_DigestFinal(ctx, buf, &olen))
{
handle_errors();
return "";
}
EVP_MD_CTX_free(ctx);
return { reinterpret_cast<char*>(buf), olen };
}
int main()
{
OpenSSL_add_all_digests();
const std::string plain = "test1234";
const std::string hash = md5_str(plain);
std::cout << "plain: " << plain << " md5 hash: " << hash << std::endl;
return EXIT_SUCCESS;
}
后面有时间再增加AES等的EVP实现代码