123下一页
返回列表 发新帖我要提问本帖赏金: 200.00元(功能说明)

开发BLE蓝牙手机上位机软件竟是如此的简单

[复制链接]
 楼主| gaoyang9992006 发表于 2021-10-25 19:06 | 显示全部楼层 |阅读模式
<
本帖最后由 gaoyang9992006 于 2021-10-26 15:46 编辑

#申请原创#@21小跑堂
做安卓手机APP通常使用高端大气的Android Studio,开发语言是Java,该开发IDE就是体积大
学习成本高,入手慢,这里给大家推荐一款国产的软件,体积小,运行和编译速度快。最重要的是编程语言是中文
这个软件就是E4A.
本次我将向大家介绍如何使用E4A开发BLE蓝牙手机上位机APP。
当然,该软件自带了丰富的例子,也提供了一个BLE例子,大家可以借鉴。
由于没有提供各种库的说明文档和帮助文件,学这个软件可能有经过一段摸索,这里我将向大家介绍我在开发这个软件中
获得的经验。
中文编程语言:易语言,采用中文作为关键字,但是编程的语法和思想和C语言是类似的
为了方便理解,这里我结合单片机开发的思路简单介绍一下
变量要声明类型
对象操作的函数称为:方法
对象可触发的中断函数称为:事件
对象可设置的参数称为:属性
-----------------------------------------------------------------------------------------
好接下来介绍 BLE蓝牙库
BLE(Bluetooth Low Energe)低功耗蓝牙设备主要用于智能穿戴和物联网。
BLE蓝牙类库,包含两种操作:方法和事件
  1. 方法:
  2.         初始化
  3.         置可被发现
  4.         开始搜索
  5.         停止搜索
  6.         连接设备
  7.         断开连接
  8.         释放资源
  9.         是否可读
  10.         是否可写
  11.         是否可通知
  12.         读取数据
  13.         写入数据
  14. 事件:
  15.         创建完毕
  16.         发现设备
  17.         信号强度改变
  18.         发现服务
  19.         连接状态改变
  20.         读取数据完毕
  21.         通道数据改变


由于不存在可见的对象,因此蓝牙没有属性设置。
了解方法和事件的用法可通过左侧类库目录选中对应的条目,在下面的提示信息中查看
例如选中BLE蓝牙库的方法 初始化 条目后:
        方法:初始化()为 逻辑型
        分类:BLE蓝牙类库---BLE蓝牙
        注释:初始化BLE蓝牙设备,成功返回真,失败返回假,BLE蓝牙需要安卓4.3以上系统的支持。
另外 事件类似中断函数,因此在代码中没有先后顺序,可以根据易读的排列顺序进行排版。
所有的动作均属于触发的事件,因此,方法通常在事件里面进行调用。
自己创建的函数,需要自己实现该函数的具体过程,因此函数在这里称为:过程
不过我们这里做BLE蓝牙APP可以不用到过程。
好了,基本的概念已经介绍了,我们可以开始整了。
-----------------------------------------------------------------------------------------
第一步,先根据我们的需要完成可视化的组件布局,并给添加的组件起上一个跟操作相关的名字,在组件的属性对话框设置,同时可以设置组件的其他相关属性。
001.png
第二步,使用中需要完成单击响应的,我们可以在设计区直接双击组件,即可自动在代码区生成一个空的事件(类似单片机开发中的中断处理函数,用于响应单击事件),例如四个方向键的单击事件。以下代码我已经填充了单击后执行的蓝牙方法:写入数据,即发数据给连接到手机的蓝牙模块。
  1. 事件 按钮上.被单击()
  2.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))
  3. 结束 事件

  4. 事件 按钮下.被单击()
  5.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))
  6. 结束 事件

  7. 事件 按钮左.被单击()
  8.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))
  9. 结束 事件

  10. 事件 按钮右.被单击()
  11.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))
  12. 结束 事件
第三步,完成主窗口的创建工作,因为我们要使用蓝牙库,所以我们可以在APP启动后就申请使用蓝牙的权利,并初始化一个蓝牙对象。
另外就是要实现软件退出的操作,所以我们可以设置一个退出的按钮,实现结束程序。内容如下。
  1. 事件 主窗口.创建完毕()
  2.         '安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行
  3.         如果 权限操作1.取系统版本号()>=23 则
  4.                 权限操作1.申请全部权限()
  5.         结束 如果        
  6.         变量 结果 为 逻辑型
  7.         结果 = BLE蓝牙1.初始化()
  8.         弹出提示("初始化结果:" & 结果)        
  9. 结束 事件

  10. 事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())
  11.         '可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码
  12. 结束 事件

  13. 事件 图片框_返回.被单击()
  14.         结束程序()
  15. 结束 事件
第四步,实现蓝牙设备的搜索,从搜索到的蓝牙信号中选出我们要的那个,另外在搜索的过程中显示信号的强度
通过按钮单击实现搜索与停止搜索,并设定搜索时间为10秒,10秒后自动停止搜索。
通过发现设备事件,读取搜到的设备,并匹配名称是否为自己要找的信号。这里我内置了信号名称,也可以通过一个输入框,实现敏感信号名称的修改
如果发现的设备名称是指定名字的信号,就将名称和地址写入到列表框的项目,同时给项目做个编号和标记,方便后面取出
使用信号强度改变事件读取搜索中的信号强度,我们只读取感兴趣的那个名字的信号。
当列表中出现我们感兴趣的那个信号名称和地址时候,我们可以单击列表中的该项,触发连接设备,实现手机与蓝牙模块的连接。
同时通过颜色和文字提示是否连接上或者断开了。这可以使用BLE蓝牙对象的连接状态改变事件实现。
  1. 事件 搜索按钮.被单击()
  2.         如果 搜索按钮.标题 = "开始搜索" 则
  3.                 位置传感器1.开始监测()
  4.                 BLE蓝牙1.开始搜索()
  5.                 时钟1.时钟周期 = 10*1000
  6.                 搜索按钮.标题 = "停止搜索"
  7.         否则        
  8.                 BLE蓝牙1.停止搜索()
  9.                 时钟1.时钟周期 = 0
  10.                 搜索按钮.标题 = "开始搜索"
  11.         结束 如果
  12. 结束 事件

  13. 事件 时钟1.周期事件()
  14.         BLE蓝牙1.停止搜索()
  15.         搜索按钮.标题 = "开始搜索"
  16.         时钟1.时钟周期 = 0
  17. 结束 事件

  18. 事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)
  19.         如果 名称 = "BT24" 则
  20.         '屏蔽掉没有名称的蓝牙设备

  21.                 弹出提示("发现设备")
  22.                 列表框1.添加项目("名称:" & 名称 & "\n地址:" & 地址)
  23.                 列表框1.置项目标记(列表框1.取项目数()-1,地址)        
  24.         结束 如果
  25. 结束 事件

  26. 事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)
  27.         如果 名称 = "BT24" 则
  28.                 列表框1.置项目内容(0,"名称:" & 名称 & "\n地址:" & 地址 & "\n信号:" & 信号强度)
  29.         结束 如果                        
  30. 结束 事件

  31. 事件 列表框1.表项被单击(项目索引 为 整数型)
  32.         设备地址 = 列表框1.取项目标记(项目索引)
  33.         BLE蓝牙1.连接设备(设备地址)
  34.         'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))
  35.         弹出提示("正在连接")
  36.         连接状态.标题 = "正在连接"

  37. 结束 事件

  38. 事件 BLE蓝牙1.连接状态改变(状态 为 整数型)
  39.         如果 状态 = 1 则
  40.                 连接状态.标题 = "已连接"
  41.                 连接状态.背景颜色 = 绿色
  42.         否则
  43.             连接状态.标题 = "已断开"
  44.                 连接状态.背景颜色 = 红色
  45.         结束 如果
  46. 结束 事件

第五步,通过服务提供的通道进行数据传输
连接上蓝牙模块后,就要建立通信的通道了,这需要通过服务来完成,因此我们要对连接的蓝牙模块索取服务的操作
这称为发现服务 事件,由于蓝牙模块中有多个服务可选,我们要找到我们可以进行通信的那个,这个通常在模块的手册也给了相关的短ID
称为服务UUID,每个服务又含有若干个通道UUID。因为模块的出厂设定,只有能用的那个服务才能通信,其他的服务是不可完全可读写的
在产生BLE蓝牙的发现服务事件后,会自动获取到服务的所有信心,装载到一个名字叫:服务信息的集合里,这个集合类型你就当类似C语言结构体数组的东西。
接下来为了验证每个服务是否可读写,就要一个一个测试,这类似,从一个结构体数组先一个一个读出来数组的元素,在数组元素的结构体里取结构体成员,
这就需要用到两层的for循环了,E4A 的for循环用一对 判断循环首---判断循环尾,进行包围。为了方便记,你可以给循环的变量起名字:i,j
然后就是测试对应的服务与通道是否可读,可写,可通知。如果三者都满足,那就是我们要找的通道,实际上,在多组的服务中,只有厂家指定的那组是
满足这三个条件的。其他的一般只能满足可读这一条。
找到合适的服务与通道后,想实现数据的接收,要执行 读取数据的方法,如果直接读,那么系统没有准备好呢,会导致读失败,后面就容易卡死。
这里就像初始化完单片机,要给系统以反应时间,等待个几百毫秒,然后再进行后面的操作一样。
这里就要用到定时器了,找到服务与通道后执行一个1000ms定时器的启动操作,在定时器计数满了之后的事件中执行读取数据的方法,
同时接收框显示服务和通道的ID,并关闭定时器。
  1. 事件 BLE蓝牙1.发现服务(服务信息 为 集合)
  2.         如果 服务信息.取项目总数() < 0 则
  3.                 退出
  4.         结束 如果
  5.         
  6.         变量 i 为 整数型
  7.         变量 j 为 整数型
  8.         变量 信息数组 为 文本型()

  9.         i = 0

  10.         判断循环首 i < 服务信息.取项目总数()
  11.                 信息数组 = 服务信息.取项目(i)
  12.                 j = 0
  13.                 判断循环首 j < 取数组成员数(信息数组)
  14.                         如果 j >0 则
  15.                                 如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则
  16.                         服务UUID = 信息数组(0)
  17.                                         通道UUID = 信息数组(j)         
  18.                                                 'BLE蓝牙1.读取数据(服务UUID,通道UUID)
  19.                                                 '接收框.内容 = 服务UUID &"\n"& 通道UUID
  20.                                                 时钟2.时钟周期 = 1000
  21.                                 结束 如果
  22.                         结束 如果
  23.                         j = j + 1
  24.                 判断循环尾               
  25.                 i = i + 1
  26.         判断循环尾        
  27. 结束 事件

  28. 事件 时钟2.周期事件()
  29.         BLE蓝牙1.读取数据(服务UUID,通道UUID)
  30.         接收框.内容 = 服务UUID &"\n"& 通道UUID
  31.         时钟2.时钟周期 = 0
  32. 结束 事件
执行完读取操作后,系统会在通道内有数据发送来的时候触发通道数据改变的事件,在该事件中我们读取数据,另外也会触发读取完毕的事件
发送数据是通过单击发送按钮触发写入数据方法实现的,当完成写入后可通过写入数据完毕事件知道是否发送成功。
  1. 事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
  2.         如果 结果 = 1 则
  3.                 弹出提示("读取数据成功:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
  4.                
  5.         否则        
  6.                 弹出提示("读取数据失败:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
  7.         结束 如果        
  8. 结束 事件

  9. 事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
  10.         弹出提示("通道数据改变" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
  11.         接收框.加入文本(字节到文本(数据,"GBK"))
  12. 结束 事件

  13. 事件 发送按钮.被单击()
  14.         BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))
  15. 结束 事件

  16. 事件 BLE蓝牙1.写入数据完毕(结果 为 整数型)
  17.         如果 结果 = 1 则
  18.                 弹出提示("写入数据成功")
  19.         否则        
  20.                 弹出提示("写入数据失败")
  21.         结束 如果
  22. 结束 事件
其他的操作可在以下完整代码中查看
  1. 变量 服务UUID 为 文本型
  2. 变量 通道UUID 为 文本型        
  3. 变量 设备地址 为 文本型

  4. 事件 主窗口.创建完毕()
  5.         '安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行
  6.         如果 权限操作1.取系统版本号()>=23 则
  7.                 权限操作1.申请全部权限()
  8.         结束 如果        
  9.         变量 结果 为 逻辑型
  10.         结果 = BLE蓝牙1.初始化()
  11.         弹出提示("初始化结果:" & 结果)        
  12. 结束 事件

  13. 事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())
  14.         '可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码
  15. 结束 事件

  16. 事件 图片框_返回.被单击()
  17.         结束程序()
  18. 结束 事件

  19. 事件 搜索按钮.被单击()
  20.         如果 搜索按钮.标题 = "开始搜索" 则
  21.                 位置传感器1.开始监测()
  22.                 BLE蓝牙1.开始搜索()
  23.                 时钟1.时钟周期 = 10*1000
  24.                 搜索按钮.标题 = "停止搜索"
  25.         否则        
  26.                 BLE蓝牙1.停止搜索()
  27.                 时钟1.时钟周期 = 0
  28.                 搜索按钮.标题 = "开始搜索"
  29.         结束 如果
  30. 结束 事件

  31. 事件 时钟1.周期事件()
  32.         BLE蓝牙1.停止搜索()
  33.         搜索按钮.标题 = "开始搜索"
  34.         时钟1.时钟周期 = 0
  35. 结束 事件

  36. 事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)
  37.         如果 名称 = "BT24" 则
  38.         '屏蔽掉没有名称的蓝牙设备

  39.                 弹出提示("发现设备")
  40.                 列表框1.添加项目("名称:" & 名称 & "\n地址:" & 地址)
  41.                 列表框1.置项目标记(列表框1.取项目数()-1,地址)        
  42.         结束 如果
  43. 结束 事件

  44. 事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)
  45.         如果 名称 = "BT24" 则
  46.                 列表框1.置项目内容(0,"名称:" & 名称 & "\n地址:" & 地址 & "\n信号:" & 信号强度)
  47.         结束 如果                        
  48. 结束 事件

  49. 事件 列表框1.表项被单击(项目索引 为 整数型)
  50.         设备地址 = 列表框1.取项目标记(项目索引)
  51.         BLE蓝牙1.连接设备(设备地址)
  52.         'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))
  53.         弹出提示("正在连接")
  54.         连接状态.标题 = "正在连接"

  55. 结束 事件

  56. 事件 BLE蓝牙1.连接状态改变(状态 为 整数型)
  57.         如果 状态 = 1 则
  58.                 连接状态.标题 = "已连接"
  59.                 连接状态.背景颜色 = 绿色
  60.         否则
  61.             连接状态.标题 = "已断开"
  62.                 连接状态.背景颜色 = 红色
  63.         结束 如果
  64. 结束 事件

  65. 事件 BLE蓝牙1.发现服务(服务信息 为 集合)
  66.         如果 服务信息.取项目总数() < 0 则
  67.                 退出
  68.         结束 如果
  69.         
  70.         变量 i 为 整数型
  71.         变量 j 为 整数型
  72.         变量 信息数组 为 文本型()

  73.         i = 0

  74.         判断循环首 i < 服务信息.取项目总数()
  75.                 信息数组 = 服务信息.取项目(i)
  76.                 j = 0
  77.                 判断循环首 j < 取数组成员数(信息数组)
  78.                         如果 j >0 则
  79.                                 如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则
  80.                         服务UUID = 信息数组(0)
  81.                                         通道UUID = 信息数组(j)         
  82.                                                 'BLE蓝牙1.读取数据(服务UUID,通道UUID)
  83.                                                 '接收框.内容 = 服务UUID &"\n"& 通道UUID
  84.                                                 时钟2.时钟周期 = 1000
  85.                                 结束 如果
  86.                         结束 如果
  87.                         j = j + 1
  88.                 判断循环尾               
  89.                 i = i + 1
  90.         判断循环尾        
  91. 结束 事件

  92. 事件 时钟2.周期事件()
  93.         BLE蓝牙1.读取数据(服务UUID,通道UUID)
  94.         接收框.内容 = 服务UUID &"\n"& 通道UUID
  95.         时钟2.时钟周期 = 0
  96. 结束 事件

  97. 事件 清空接收按钮.被单击()
  98.         接收框.内容 = 空
  99. 结束 事件



  100. 事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
  101.         如果 结果 = 1 则
  102.                 弹出提示("读取数据成功:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
  103.                
  104.         否则        
  105.                 弹出提示("读取数据失败:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
  106.         结束 如果        
  107. 结束 事件

  108. 事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
  109.         弹出提示("通道数据改变" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
  110.         接收框.加入文本(字节到文本(数据,"GBK"))
  111. 结束 事件

  112. 事件 发送按钮.被单击()
  113.         BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))
  114. 结束 事件

  115. 事件 BLE蓝牙1.写入数据完毕(结果 为 整数型)
  116.         如果 结果 = 1 则
  117.                 弹出提示("写入数据成功")
  118.         否则        
  119.                 弹出提示("写入数据失败")
  120.         结束 如果
  121. 结束 事件

  122. 事件 连接状态.被单击()
  123.         如果 连接状态.背景颜色 = 绿色 则
  124.                 BLE蓝牙1.断开连接()
  125.                 连接状态.标题 = "正在断开"
  126.         否则
  127.                 连接状态.标题 = "正在连接"
  128.                 BLE蓝牙1.连接设备(设备地址)        
  129.         结束 如果
  130. 结束 事件

  131. 事件 读取按钮.被单击()
  132.         BLE蓝牙1.读取数据(服务UUID,通道UUID)
  133. 结束 事件

  134. 事件 接收框.创建完毕()
  135.         接收框.置多行模式(真)
  136. 结束 事件

  137. 事件 按钮上.被单击()
  138.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))
  139. 结束 事件

  140. 事件 按钮下.被单击()
  141.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))
  142. 结束 事件

  143. 事件 按钮左.被单击()
  144.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))
  145. 结束 事件

  146. 事件 按钮右.被单击()
  147.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))
  148. 结束 事件
技巧:分割线可以使用标签组件制作,如下图所示。
002.png
另外就是关于生成后程序的属性设置,比如版本号,设计的分辨率,图标等
003.png









 楼主| gaoyang9992006 发表于 2021-10-25 20:52 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2021-10-26 21:57 编辑

实测截图下图为蓝牙串口模块,与电脑连接,红灯常亮表示已连接手机蓝牙,闪烁表示等待连接。
下载.png
下图为串口助手与手机通过蓝牙模块进行通信的截图
004.png
下图为手机画面截图
下载.png
讲解视频
https://www.bilibili.com/video/BV1rb4y1b7ez/




打赏榜单

21小跑堂 打赏了 200.00 元 2021-10-26
理由:恭喜通过原创奖文章审核!请多多加油哦!

评论

马上用上,谢谢楼主的分享。  发表于 2021-11-9 16:53
icestream 发表于 2021-10-26 16:46 | 显示全部楼层
受益匪浅,非常有用
 楼主| gaoyang9992006 发表于 2021-10-26 16:53 | 显示全部楼层
icestream 发表于 2021-10-26 16:46
受益匪浅,非常有用

感谢支持
稳稳の幸福 发表于 2021-10-26 21:52 | 显示全部楼层
真是方便。
怀揣少年梦 发表于 2021-10-27 08:32 | 显示全部楼层
这款软件就是厉害,简洁
甘木 发表于 2021-10-27 13:50 | 显示全部楼层
学习学习,,

由于没有提供各种库的说明文档和帮助文件,学这个软件可能有经过一段摸索,这里我将向大家介绍我在开发这个软件中
获得的经验。

---------------------
freeelectron 发表于 2021-10-28 13:43 | 显示全部楼层
E4A支持修改MTU吗?
 楼主| gaoyang9992006 发表于 2021-10-28 14:13 | 显示全部楼层

什么是MTU
Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。

这是哪一层网络的概念?
从下面这个表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。

指的这个吗?
 楼主| gaoyang9992006 发表于 2021-10-28 14:20 | 显示全部楼层

数据报组件支持设置数据包的大小设定:
置每次接收数据包大小,单位为字节,如果不设置此项,数据报组件将使用默认1024字节大小进行接收。
Gavin3389 发表于 2021-10-29 15:17 | 显示全部楼层
嘿~~这个软件厉害啊~

易语言?虽然看着不太习惯,但是感觉理解和上手应该还可以~~~
xj803 发表于 2021-10-29 16:50 | 显示全部楼层
好东西,铺的开就好了。
lu50211 发表于 2021-10-30 08:39 | 显示全部楼层
好教程,受益了
 楼主| gaoyang9992006 发表于 2021-10-30 09:15 | 显示全部楼层
Gavin3389 发表于 2021-10-29 15:17
嘿~~这个软件厉害啊~

易语言?虽然看着不太习惯,但是感觉理解和上手应该还可以~~~

这个跟易语言还是不同的,是参考易语言做的另外一款专门用于手机软件开发的易安卓。比易语言容易学,如果有C语言基础,30分钟就能上手。
 楼主| gaoyang9992006 发表于 2021-10-30 09:16 | 显示全部楼层
Gavin3389 发表于 2021-10-29 15:17
嘿~~这个软件厉害啊~

易语言?虽然看着不太习惯,但是感觉理解和上手应该还可以~~~

可以看看我的B站视频教程,有讲解基础概念。
 楼主| gaoyang9992006 发表于 2021-10-30 09:16 | 显示全部楼层

建议再看看我的B站发的视频教程,讲解的比较详细。
 楼主| gaoyang9992006 发表于 2021-10-30 09:17 | 显示全部楼层
xj803 发表于 2021-10-29 16:50
好东西,铺的开就好了。

嗯,必须的铺的开。
cjseng 发表于 2021-10-30 21:07 | 显示全部楼层
这个E4A有没有英文版的,就是可以用英文编程的版本,虽然我英文不大**,但是还是习惯用英文编程呐
ahwai 发表于 2021-10-30 22:33 | 显示全部楼层
点赞
 楼主| gaoyang9992006 发表于 2021-10-31 21:48 | 显示全部楼层
caosix 发表于 2021-10-30 13:42
谢谢 楼主 ,你的介绍 【如何使用E4A开发BLE蓝牙手机上位机APP。】
——这个 E4A 是 免费下载 ...

免费下载,免费使用,商用可付费,几十块钱而已。不付费也没事,就是启动时候先弹出这个开发工具的名字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2048

主题

16367

帖子

221

粉丝
快速回复 在线客服 返回列表 返回顶部