会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!

简介: 会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!

1、UI软件逻辑开发痛点

串口屏相信各位开发者都不陌生了,它解决了大多数开发者在嵌入式UI应用方向的痛点,常见的痛点主要有以下几个方面:


1、市面上的UI框架层出不穷,不知道如何选择,常见的有UCGUI,EMWIN,MINIGUI,AWTK,QT等等。


2、需要花时间去熟悉一个成熟的UI框架,并将它集成到自己的程序上去,例如emWin,随便找一个这方面的开发文档,动则上千页,让众多开发者闻风丧胆。

640.png

3、不使用GUI框架,下面的大数组,让你感受一下:

640.png

这还只是单色图,如果是选择16位真彩色呢?这个数组得有多大?不得自己加FLASH进行存储吗?

640.png

近年来,市面上出现了许多优秀的串口屏厂家,例如迪文、淘晶驰、大彩、中显、尚视界等等,串口屏的出现简直就是众多开发者和创业公司的福音呀!

从曾经的项目开发周期很长,缩短到了一周甚至是一两天,即可轻松完成项目研发,减少了企业硬件研发方面的费用支出,提高了软件开发效率,同时产品也能够快速更新迭代。

2、Yoxios是什么?

接下来介绍一款在我最近入手的全新的类串口屏,它的功能比传统串口屏要强大得多,为什么说它强大,因为它支持二次开发,随便一个模块,只要板子上有接口,都可以通过Yoxios HMI去操控它。当你使用Yoxios的时候,也顺便将Linux应用开发一起学习并且掌握了,不得不说这是一个利器,不单是开发简单,也能让一直从事单片机开发的小伙伴们轻轻松松入门Linux应用。


Yoxios官网:https://www.yoxios.com/main

640.png

640.png

640.png

话不多说,一分钟了解一下Yoxios:


Yoxios 提供了可供用户开发的硬件和软件接口,官网上也提供了完善的开发文档和不少样例,如果有兴趣可以去了解一下。    

640.png

3、Yoxios实战之Yoxios+ESP8266控制小车

3.1 硬件配置

参考:http://bbs.yoxios.com/forum.php?mod=viewthread&tid=6&extra=page%3D1

640.png

ESP8266引脚和接线(官方论坛提供的接口)

X3开发板 ESP8266模块
VCC3.3 VCC
GND

GND

U2TX RX
U2RX TX
普通IO / 悬空 RST
SPICS CH_PD/EN

这里我做的唯一和论坛的区别是在硬件上将WIFI使能管脚(CH_PD/EN)直接接到3.3V,这样软件上不需要使能该管脚,上电即使能。

3.2 UI布局

640.png

3.3 代码逻辑

这个项目的核心代码主要是在jni/logic/mainlogic.cc这个文件下编写,参考官网及论坛demo后修改程序如下:


mainLogic.cc

#include <stdlib.h>
#include <iostream>
#include "string"
#include "uart/ProtocolSender.h"
#include "uart/UartContext.h"
string sendMsg, showMsg;
bool WifiConnet = false;
struct {
  string name;
  string password;
  string IP;
  string port;
} WifiConFig;
/**
 * 串口数据回调接口
 */
static void onProtocolDataUpdate(BYTE *key, int readNum) {
  // 串口数据回调接口
  char* p = new char[readNum];
  memcpy(p, key, readNum);
  p[readNum] = 0;
  if (strstr(p, "ready") != NULL) {
    showMsg = "";
    mTextView3Ptr->setText(showMsg);
    return;
  }
  showMsg += p;
  mTextView3Ptr->setText(showMsg);
}
static void WifiReset() {
  string s = "AT+CWMODE=1\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  s = "AT+RST\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  mTextView3Ptr->setText("wifi 初始化");
}
static void WifiConnect() {
  WifiConFig.name = "Smart_Car";
  WifiConFig.password = "12345678";
  string s = "AT+CWJAP=\"" + WifiConFig.name + "\",\"" + WifiConFig.password
      + "\"\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  mTextView3Ptr->setText("wifi 连接");
}
static void WifiTCPConnect() {
  string s = "AT+CIPMUX=0\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  usleep(500000);
  s = "AT+CIPMODE=1\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  usleep(500000);
  //连接服务器
  WifiConFig.IP = "192.168.4.1";
  WifiConFig.port = "8080";
  s = "AT+CIPSTART=\"TCP\",\"" + WifiConFig.IP + "\"," + WifiConFig.port
      + "\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  usleep(100000);
  //进入透传模式
  s = "AT+CIPMODE=1\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  usleep(100000);
  //开始透传数据
  s = "AT+CIPSEND\r\n";
  UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
  usleep(100000);
  mTextView3Ptr->setText("TCP 连接");
  mTextView5Ptr->setText("Smart_Car 192.168.4.1 8080");
}
/**
 * 定时器触发函数
 * 不建议在此函数中写耗时操作,否则将影响UI刷新
 * 参数:id
 *         当前所触发定时器的id,与注册时的id相同
 * 返回值: true
 *             继续运行当前定时器
 *         false
 *             停止运行当前定时器
 */
static bool onUI_Timer(int id) {
  //Tips:添加定时器响应的代码到这里,但是需要在本文件的 REGISTER_ACTIVITY_TIMER_TAB 数组中 注册
  //id 是定时器设置时候的标签,这里不要写耗时的操作,否则影响UI刷新,ruturn:[true] 继续运行定时器;[false] 停止运行当前定时器
  switch (id) {
  case 0:
    WifiConnect();
    return false;
    break;
  case 1:
    WifiTCPConnect();
    return false;
    break;
  default:
    break;
  }
  return true;
}
/**
 * 有新的触摸事件时触发
 * 参数:ev
 *         新的触摸事件
 * 返回值:true
 *            表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上
 *         false
 *            触摸事件将继续传递到控件上
 */
static bool onmainActivityTouchEvent(const MotionEvent &ev) {
  switch (ev.mActionStatus) {
  case MotionEvent::E_ACTION_DOWN:  //触摸按下
    LOGD("时刻 = %ld 坐标  x = %d, y = %d", ev.mEventTime, ev.mX, ev.mY);
    //前进
    if (ev.mX > 180 && ev.mX < 290 && ev.mY > 70 && ev.mY < 106) {
      string s = "GO\r\n";
      UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
    }
    //后退
    if(ev.mX > 180 && ev.mX < 290 && ev.mY > 180 && ev.mY < 208)
    {
      string s = "BACK\r\n";
      UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
    }
    //左
    if(ev.mX > 65 && ev.mX < 131 && ev.mY > 128 && ev.mY < 165)
    {
      string s = "LEFT\r\n";
      UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
    }
    //右
    if(ev.mX > 298 && ev.mX < 400 && ev.mY > 131 && ev.mY < 166)
    {
      string s = "RIGHT\r\n";
      UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
    }
    break;
    case MotionEvent::E_ACTION_MOVE:      //触摸滑动
    break;
    case MotionEvent::E_ACTION_UP://触摸抬起
    LOGD("按键抬起");
    string s = "STOP\r\n";
    UARTCONTEXT->send((BYTE *)s.c_str(),s.length());
    break;
    default:
    break;
  }
  return false;
}
//连接小车
static bool onButtonClick_Button5(ZKButton *pButton) {
  LOGD(" ButtonClick Button5 !!!\n");
  WifiReset();
  mActivityPtr->registerUserTimer(0, 3000);
  mActivityPtr->registerUserTimer(1, 8000);
  return false;
}

其中小车部分控制逻辑参考:


圆曾经的小车梦,造一台智能小车(四)之QT上位机控制小车


圆曾经的小车梦,造一台智能小车(三)之小车前进后退左右转基本框架


3.4运行结果


4、Demo案例下载

公众号后台回复:yoxi 即可获取所有案例及参考demo的下载链接。

640.png

往期精彩

【编译器玄学研究报告】第一期——位域和volatile


MCU SPI屏也能跑这么炫酷的特效?来,移植起来秀一秀


移植一个实时OS很难?那就手把手教你如何快速移植一个RT-Thread Nano吧!

目录
相关文章
|
5天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
22 5
WK
|
16天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
38 1
|
22天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
46 5
|
21天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
101 21
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
82 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
67 7
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
35 1
WK
|
16天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
31 0
WK
|
16天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
19 0