(转)开源按键处理项目:状态事件驱动按键驱动模块,按键事件的回调处理方式可以简化你的程序逻辑【MultiButton】

°別敷衍涐 回复了问题 • 6 人关注 • 2 个回复 • 1378 次浏览 • 6 天前 • 来自相关话题

分享一个keil配色方案

cqhejian 回复了问题 • 13 人关注 • 12 个回复 • 7748 次浏览 • 2018-05-29 23:41 • 来自相关话题

从keil4升级到keil5之后J-LINK自动升级导致闪退解决办法

y!ng 回复了问题 • 8 人关注 • 5 个回复 • 10152 次浏览 • 2018-05-22 10:01 • 来自相关话题

上位机编写之aardio调用html5图表控件

爱哭的热带鱼 回复了问题 • 8 人关注 • 19 个回复 • 3122 次浏览 • 2018-01-16 14:08 • 来自相关话题

aardio开发上位机学习启用独立域名了: www.htmlayout.cn , 请移步到此处学习!

回复

admin 发起了问题 • 1 人关注 • 0 个回复 • 280 次浏览 • 2018-01-04 21:31 • 来自相关话题

分享一个利用Cubemx直接生成Coide工程文件的小工具(欢迎提交bug)

super_meters 回复了问题 • 3 人关注 • 2 个回复 • 3502 次浏览 • 2017-10-18 09:17 • 来自相关话题

IAP调试前准备之什么是IAP?协议Ymodem是什么?运行机制是什么

仿如梦境 回复了问题 • 2 人关注 • 1 个回复 • 1596 次浏览 • 2017-10-14 19:01 • 来自相关话题

(转)从一个结构更加开放自由的 12864模块的设计过程,学习各种结构体和函数指针的使用

回复了问题 • 11 人关注 • 8 个回复 • 2316 次浏览 • 2017-09-26 13:43 • 来自相关话题

(自用)aar里面的一些基本功能笔记

admin 发表了文章 • 39 个评论 • 1183 次浏览 • 2017-09-14 13:29 • 来自相关话题

string库中的concat拼接字符串:这个函数提示里面只是显示了两个可用参数,实际应用过程中,可以添加无数个参数,,,都会拼接到一起的.str = string.concat(str,linestr[i],'\r\n',"aaadddggg");这个意思就是把括号里面的四个参数作为字符串拼接到了一起... 查看全部

string库中的concat拼接字符串:

blob.png

这个函数提示里面只是显示了两个可用参数,实际应用过程中,可以添加无数个参数,,,都会拼接到一起的.

str = string.concat(str,linestr[i],'\r\n',"aaadddggg");

这个意思就是把括号里面的四个参数作为字符串拼接到了一起...

(自用)AAR里一些好玩的功能

admin 发表了文章 • 65 个评论 • 2076 次浏览 • 2017-08-23 12:39 • 来自相关话题

最近aar作者Jacen He更新了一些新库:二维码和条形码的识别库Zbar//生成测试二维码
import qrencode.bitmap;
var qrBmp = qrencode.bitmap("http://www.stm32cube.com/#Stm32cube中文网" );
qrBmp.copyBitmap(100).save("/qrcode.jpg",80) 
 
//识别二维码    
import zbar;
import soImage; //此扩展库要使用最新版

var img = soImage();
img.load("/qrcode.jpg");//加载二维码图像
img.grayScale();
    
scanner = zbar.scanner();
scanner.config('qrcode.enable');//可省略

import console;
scanner.scan(img.getData(),img.getWidth(),img.getHeight(),function(typeName,data){
     console.log(typeName,data)
    })
     
    
console.pause();二维码和条形码的应用挺广泛的,这个库实用性很大,先前也实现过类似功能,不过用的调用js的方法. 查看全部

最近aar作者Jacen He更新了一些新库:

二维码和条形码的识别库Zbar

//生成测试二维码
import qrencode.bitmap;
var qrBmp = qrencode.bitmap("http://www.stm32cube.com/#Stm32cube中文网" );
qrBmp.copyBitmap(100).save("/qrcode.jpg",80) 
 
//识别二维码    
import zbar;
import soImage; //此扩展库要使用最新版

var img = soImage();
img.load("/qrcode.jpg");//加载二维码图像
img.grayScale();
    
scanner = zbar.scanner();
scanner.config('qrcode.enable');//可省略

import console;
scanner.scan(img.getData(),img.getWidth(),img.getHeight(),function(typeName,data){
     console.log(typeName,data)
    })
     
    
console.pause();

blob.png

二维码和条形码的应用挺广泛的,这个库实用性很大,先前也实现过类似功能,不过用的调用js的方法.

(转)USB复合设备和USB组合设备的区别和实现代码分析

jcdzxh 回复了问题 • 9 人关注 • 4 个回复 • 4427 次浏览 • 2017-08-22 20:49 • 来自相关话题

(转)设置stm32芯片的读保护来防止恶意读取代码的方法

admin 发表了文章 • 0 个评论 • 2298 次浏览 • 2017-08-08 20:12 • 来自相关话题

现在的MCU大部分都会提供读保护和写保护的功能。读保护:保护保存在MCU上的执行代码不会被调试/下载工具拷贝出来。STM32 读保护有三个等级 L0 L1 L2  L0 是没有保护,可以随意读出来的,一般调试过程中选择。在L0 状态可以设置成L1 或者L2,修改完成不会擦除芯片已有的代码;  L1 是可恢复读保护,L1-->L0状态,,会自动擦除已有的程序。L1->L2,这个设置还没有试过,(正常理解是不擦除);  L2 是不可恢复读保护,此状态下,不可恢复到其他的状态,同时芯片里的程序不能再升级 类似OTP了;  这个主要是保护代码不会被其他人恶意拷贝,保护原作者的权益。写保护: 保护存在MCU上的代码 不会被异常修改。正常的代码更新流程需要先失能对应的保护位,更新完成再次恢复之前的保护位。这个主要是保护程序正常运行的时候,不会被异常更改。如图的STM32 ST-LINK UNILITY 工具上的读写保护和一些用户设置,包括在调试的停时 看门狗是否继续计数等设置本文转自:http://www.stmcu.org/module/fo ... .html 我们利用这个读保护特性可以在程序中自由的上锁和解锁我们不需要设置什么按键检测,我们程序中有串口或者usb,spi等等通信的话,可以利用这个通信指令来解锁.我们在while之前加载读保护代码:int main(void)
{
    ....
      
    if(FLASH_GetReadOutProtectionStatus() != SET)
    {
        //FLASH_Unlock();不解锁FALSH也可设置读保护???
        FLASH_ReadOutProtection(ENABLE);   
    }
    ......
    while(1)
    {
       .....
     }
} 然后我们可以在通信程序里面进行指令解析然后,解锁读保护if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}这种读保护操作应该是最简单的代码保护方式了吧?..... 查看全部

现在的MCU大部分都会提供读保护和写保护的功能。
读保护:保护保存在MCU上的执行代码不会被调试/下载工具拷贝出来。

STM32 读保护有三个等级 L0 L1 L2
 L0 是没有保护,可以随意读出来的,一般调试过程中选择。在L0 状态可以设置成L1 或者L2,修改完成不会擦除芯片已有的代码;
 L1 是可恢复读保护,L1-->L0状态,,会自动擦除已有的程序。L1->L2,这个设置还没有试过,(正常理解是不擦除);
 L2 是不可恢复读保护,此状态下,不可恢复到其他的状态,同时芯片里的程序不能再升级 类似OTP了
 这个主要是保护代码不会被其他人恶意拷贝,保护原作者的权益。

写保护: 保护存在MCU上的代码 不会被异常修改。

正常的代码更新流程需要先失能对应的保护位,更新完成再次恢复之前的保护位。
这个主要是保护程序正常运行的时候,不会被异常更改。
如图的STM32 ST-LINK UNILITY 工具上的读写保护和一些用户设置,包括在调试的停时 看门狗是否继续计数等设置

213322bzprzlmxxpzk2pkz.png

本文转自:http://www.stmcu.org/module/fo ... .html

 

我们利用这个读保护特性可以在程序中自由的上锁和解锁

我们不需要设置什么按键检测,我们程序中有串口或者usb,spi等等通信的话,

可以利用这个通信指令来解锁.

我们在while之前加载读保护代码:

int main(void)
{
    ....
      
    if(FLASH_GetReadOutProtectionStatus() != SET)
    {
        //FLASH_Unlock();不解锁FALSH也可设置读保护???
        FLASH_ReadOutProtection(ENABLE);   
    }
    ......
    while(1)
    {
       .....
     }
}

 然后我们可以在通信程序里面进行指令解析然后,解锁读保护

if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}

这种读保护操作应该是最简单的代码保护方式了吧?.....

(转)aardio字符串模式匹配快速入门

回复

admin 回复了问题 • 1 人关注 • 9 个回复 • 1099 次浏览 • 2017-08-05 01:01 • 来自相关话题

(已弃)利用串口来模拟spi发送一定数量的上升沿脉冲

回复

admin 回复了问题 • 1 人关注 • 1 个回复 • 641 次浏览 • 2017-08-02 13:05 • 来自相关话题

Aardio学习笔记4

admin 发表了文章 • 11 个评论 • 900 次浏览 • 2017-07-17 13:08 • 来自相关话题

还是分析Gcode代码用的,先前是直接循环获取一行的数据然后解析显示到listbox中,现在需要点击任意一行然后进行解析测试,如果没有选中任意一行那么就继续循环解析:listbox中有这么个函数:win.ui.ctrl.listbox() = 列表框\n!listbox.
!listbox.cls = 设计时类名
!listbox.className = 运行时类名
!listbox.clear() = 清除列表框所有内容
!listbox.delete() = 删除当前选中项
!listbox.delete(__) = 删除指定项
!listbox.getItemText(__/*项索引*/) = 获取指定项文本
!listbox.getItemRect(__/*项索引*/) = 获取指定项区块位置\n返回::RECT() 结构体
!listbox.getAt(x,y) = 返回指定客户区坐标所在的项索引.
!listbox.add(__/*请输入文本*/) = 添加列表项到尾部
!listbox.add(__/*请输入文本*/,-1) = 添加列表项到尾部
!listbox.add(__/*请输入文本*/,1) = 添加列表项到头部
!listbox.selIndex = 获取或设置列表框当前选中项\n仅在单选模式下有效,多选模式下请使用 getSelected() setSelected() 函数
!listbox.selText = 获取当前选项的文本\n或根据指定的文本查找并改变选项对于这些理解的不是很深,所以需要一步步实践下:姑且会用到mainForm.listbox.selIndex, mainForm.listbox.selText于是在界面中增加一个按钮,用来显示哪个被点选了...console.log(mainForm.listbox.selIndex,mainForm.listbox.selText);blob.png实现上面的完整代码如下:import win.ui;/*DSG{{*/mainForm = win.form(text="aardio form";right=561;bottom=654)mainForm.add(Motion_file={cls="listbox";left=373;top=10;right=552;bottom=530;edge=1;items={};z=2};button={cls="button";text="加载";left=16;top=542;right=173;bottom=591;z=3};button2={cls="button";text="转换";left=197;top=541;right=551;bottom=590;z=4};button3={cls="button";text="获取谁被点选了";left=20;top=598;right=177;bottom=647;z=5};listbox={cls="listbox";left=11;top=9;right=361;bottom=529;edge=1;items={};vscroll=1;z=1})/*}}*/import console;console.open()mainForm.button3.oncommand = function(id,event){ //mainForm.msgbox( mainForm.button3.text ); console.log(mainForm.listbox.selIndex,mainForm.listbox.selText);}mainForm.button.oncommand = function(id,event){ //mainForm.msgbox( mainForm.button.text ); var filecontent = string.load("\res\5047.nc");    var linestr = string.split(filecontent,'<\r\n>')    for(i=1;#linestr;1){           //增加编码转换,这样就不会显示乱码了        mainForm.listbox.add(string.fromto(linestr[i],0,65001));    } }G_conv = function(str){    var delspace = string.replace(str," ","");    var letter = string.split(delspace);    var num = "";    for(i=1;#letter;1){        //如果字符为空字符则不作处理继续循环        if(letter[i] == " "){            continue ;        }        //强制转换为数字格式,不是数字则返回null,是则返回数字        var k,v = tonumber(letter[i]);        //判断是数字,或者是负号,或者是小数点?        if( (k != null) || (letter[i] == "-")|| (letter[i] == ".")){            //连接这些数字            num = num ++ letter[i];            //如果字符串末尾是数字,则直接输出数字            if(i == #letter){                //console.log(num)                mainForm.Motion_file.add(num);                num ="";            }        }else {    //不是数字,直接输出            if(num != ""){                mainForm.Motion_file.add(num);                num = "";            }            //console.log(num)            mainForm.Motion_file.add(letter[i]);            //console.log(letter[i])        }      }            }var iItem =1;mainForm.button2.oncommand = function(id,event){ var lineCurnum ; mainForm.Motion_file.clear(); G_conv(mainForm.listbox.getItemText(iItem)); iItem++; if(iItem>mainForm.listbox.count){ iItem = 1; } }mainForm.listbox.wndproc = function(hwnd,message,wParam,lParam){    select(message) {        case 0x233/*_WM_DROPFILES*/ {            mainForm.listbox.clear();            var path = win.getDropFile(wParam)[1];            var filecontent = string.load(path);            var linestr = string.split(filecontent,'<\r\n>')            for(i=1;#linestr;1){                   //增加编码转换,这样就不会显示乱码了                mainForm.listbox.add(string.fromto(linestr[i],0,65001));            }                     }        else {        }    }     }mainForm.enableDpiScaling();mainForm.show();return win.loopMessage(); 查看全部

还是分析Gcode代码用的,先前是直接循环获取一行的数据然后解析显示到listbox中,现在需要点击任意一行然后进行解析测试,如果没有选中任意一行那么就继续循环解析:

listbox中有这么个函数:

win.ui.ctrl.listbox() = 列表框\n!listbox.
!listbox.cls = 设计时类名
!listbox.className = 运行时类名
!listbox.clear() = 清除列表框所有内容
!listbox.delete() = 删除当前选中项
!listbox.delete(__) = 删除指定项
!listbox.getItemText(__/*项索引*/) = 获取指定项文本
!listbox.getItemRect(__/*项索引*/) = 获取指定项区块位置\n返回::RECT() 结构体
!listbox.getAt(x,y) = 返回指定客户区坐标所在的项索引.
!listbox.add(__/*请输入文本*/) = 添加列表项到尾部
!listbox.add(__/*请输入文本*/,-1) = 添加列表项到尾部
!listbox.add(__/*请输入文本*/,1) = 添加列表项到头部
!listbox.selIndex = 获取或设置列表框当前选中项\n仅在单选模式下有效,多选模式下请使用 getSelected() setSelected() 函数
!listbox.selText = 获取当前选项的文本\n或根据指定的文本查找并改变选项

对于这些理解的不是很深,所以需要一步步实践下:

姑且会用到

mainForm.listbox.selIndex, mainForm.listbox.selText

于是在界面中增加一个按钮,用来显示哪个被点选了...

console.log(mainForm.listbox.selIndex,mainForm.listbox.selText);

blob.png

实现上面的完整代码如下:

import win.ui;

/*DSG{{*/

mainForm = win.form(text="aardio form";right=561;bottom=654)

mainForm.add(

Motion_file={cls="listbox";left=373;top=10;right=552;bottom=530;edge=1;items={};z=2};

button={cls="button";text="加载";left=16;top=542;right=173;bottom=591;z=3};

button2={cls="button";text="转换";left=197;top=541;right=551;bottom=590;z=4};

button3={cls="button";text="获取谁被点选了";left=20;top=598;right=177;bottom=647;z=5};

listbox={cls="listbox";left=11;top=9;right=361;bottom=529;edge=1;items={};vscroll=1;z=1}

)

/*}}*/


import console;

console.open()

mainForm.button3.oncommand = function(id,event){

//mainForm.msgbox( mainForm.button3.text );

console.log(mainForm.listbox.selIndex,mainForm.listbox.selText);

}



mainForm.button.oncommand = function(id,event){

//mainForm.msgbox( mainForm.button.text );

var filecontent = string.load("\res\5047.nc");

    var linestr = string.split(filecontent,'<\r\n>')

    for(i=1;#linestr;1){   

        //增加编码转换,这样就不会显示乱码了

        mainForm.listbox.add(string.fromto(linestr[i],0,65001));

    }

}



G_conv = function(str){

    var delspace = string.replace(str," ","");

    var letter = string.split(delspace);

    var num = "";

    for(i=1;#letter;1){

        //如果字符为空字符则不作处理继续循环

        if(letter[i] == " "){

            continue ;

        }

        //强制转换为数字格式,不是数字则返回null,是则返回数字

        var k,v = tonumber(letter[i]);

        //判断是数字,或者是负号,或者是小数点?

        if( (k != null) || (letter[i] == "-")|| (letter[i] == ".")){

            //连接这些数字

            num = num ++ letter[i];

            //如果字符串末尾是数字,则直接输出数字

            if(i == #letter){

                //console.log(num)

                mainForm.Motion_file.add(num);

                num ="";

            }

        }else {    //不是数字,直接输出

            if(num != ""){

                mainForm.Motion_file.add(num);

                num = "";

            }

            //console.log(num)

            mainForm.Motion_file.add(letter[i]);

            //console.log(letter[i])

        }

  

    }

  

     

     

}

var iItem =1;

mainForm.button2.oncommand = function(id,event){

var lineCurnum ;

mainForm.Motion_file.clear();

G_conv(mainForm.listbox.getItemText(iItem));

iItem++;

if(iItem>mainForm.listbox.count){

iItem = 1;

}

}



mainForm.listbox.wndproc = function(hwnd,message,wParam,lParam){

    select(message) {

        case 0x233/*_WM_DROPFILES*/ {

            mainForm.listbox.clear();

            var path = win.getDropFile(wParam)[1];

            var filecontent = string.load(path);

            var linestr = string.split(filecontent,'<\r\n>')

            for(i=1;#linestr;1){   

                //增加编码转换,这样就不会显示乱码了

                mainForm.listbox.add(string.fromto(linestr[i],0,65001));

            }

             

        }

        else {

        }

    }

     

}



mainForm.enableDpiScaling();

mainForm.show();


return win.loopMessage();