Android端对单片机升级其实Android端只需要实现文件传输并在界面上显示传输进度。
Android 端和单片机通信是串口进行通信的,通信数据协议基于Ymodem
由于Ymodem协议本身就是采用C语言实现,对于单片机端实现并不是很困难,Android 端也可以采用将C代码编译成so调用。
对于一个擅长java语言的人,调试C代码简直痛苦不堪。
经过github搜索一番,找到一个java语言实现的版本。
阅读了这个java版本的代码发现与需求还是有一定的差距,遂对这个项目改造一番终于顺利移植到项目中。
这个项目不能直接引用有如下问题:
1.Android 端不适合采用nio的方式读写文件,替换方案:线程+File
2.该项目采用的是io流的方式,需要用我们自己的串口通信方式替换(收发均为字节码)
3.去除接收单片机发送文件相关的方法
4.Ymodem协议是收数据方主动发起交互指令,而需求是用户在Android端点击一个按钮开始升级固件,我们只需要单片机和Android端增加一条自定义指令就可以实现。
5.界面上需要显示文件传输的进度,我们采用EventBus将各个过程和进度等信息post到Activity上做UI显示。
以下记录改造过程:
1.创建工程后将ru.sir.ymodem中的代码全部拷贝到项目中
2.由于我们只需要用到YModem协议部分,所以删除多余的无用类
CRC.java 保留
CRC16.java 保留
CRC8.java 保留
Modem.java 需要修改
TimeoutException.java 保留
Timer.java 保留
XModem.java 删除
XModem1K.java 删除
YModem.java 需要修改
3.打开Ymode和Modem类,将里面Path类替换成File,将Path相应的方法替换成File中同类型的方法。
4.将Ymode和Mode的构造方法中的IO流替换成我们自己的串口通信类,以便在Modem中通信发送和接受来自单片机的指令。
5.在MainActivity的按钮中开启一个线程,执行两个过程,1.发送开始升级指令给单片机 2.new YModem(mUartManager).send("/sdcard/firmware.bin");
MainActivity.jpg
github: https://github.com/h4de5ing/MCUUpdate
如果项目对你有帮助请点赞鼓励,谢谢。
有问题请反馈 https://github.com/h4de5ing/MCUUpdate/issues
参考:
https://github.com/aesirot/ymodem
https://baike.baidu.com/item/Ymodem/10430652
http://blog.csdn.net/lijing198997/article/details/29839505
网友评论