迪文科技论坛

 找回密码
 立即注册
搜索
查看: 800|回复: 7

【开源】安卓与迪文屏的无线交互应用

[复制链接]

4

主题

6

回帖

511

积分

高级会员

Rank: 4

积分
511
发表于 2023-11-9 17:15:49 | 显示全部楼层 |阅读模式
本帖最后由 good 于 2023-11-29 18:21 编辑

一.简介

    首先本项目分为俩个部分组成,即上位机,和下位机,首先对上位机和下位机做个说明.
上位机:即安卓手机App应用程序,必须在安卓手机上运行不能在电脑上运行,用Eclipse软件开发,所用语言为java语言,在本项目中主要是利用到了手机的蓝牙模块功能(用程序描述也就是BluetootthAdapter类)。
  下位机:我想这个大家都应该了解,即单片机模块,在我们的这个项目中所用的就是T5L芯片的迪文屏
     
  本项目所要实现的功能为通过安卓手机上的App中蓝牙功能和迪文屏进行无延时的数据收发,支持Ascii码, Char, GBK, UNICODE等多种编码格式,还支持数据回显(透明,自定义内容等),支持多设备并行通信, 支持导出文件和导入文件,更有意思的是实现了16*16 LED点阵广告屏的功能,在点阵屏功能中支持二次画布编辑,可以进行顺序或者逆序取模等多种功能


二.硬件需求
  基于安卓系统的智能手机一部(一般现在的智能手机都自带蓝牙功能),T5L迪文屏一块,HC-05或者HC-06(带底盘的,这样方便连线)从机蓝牙模块一个(接在T5L迪文屏串口上)
HC-05或者HC-06主要引出四个引脚,分别为GND,VCC,RXD,TXD,  其连接很简单GNDVCC分别连到迪文屏的VCCGND,RXD接到迪文屏TXD2引脚,而TXD连到迪文屏RXD上

三.GUI工程设计

  图片素材如下
主界面的截图如下


三.C51工程设计


#if(1)
#define MODBUS_RECV_TIMEOUT        50
static bit is_modbus_recv_complete = 0;
static u8 modbus_recv_buff[1024];
static u16 modbus_recv_len = 0;
static u8 modbus_recv_timeout = 0;



void modbus_recv_byte(u8 byte)
{
        if(is_modbus_recv_complete)
                return;
        if(modbus_recv_len<sizeof(modbus_recv_buff))
                modbus_recv_buff[modbus_recv_len++] = byte;
        modbus_recv_timeout = MODBUS_RECV_TIMEOUT;
}



void modbus_check_recv_timeout()
{
        if(modbus_recv_timeout)
        {
                modbus_recv_timeout--;
                if(modbus_recv_timeout==0)
                {
                        is_modbus_recv_complete = 1;
                }
        }
}


void uart2_isr()        interrupt 4
{
        if(RI0)
        {
                RI0 = 0;
                modbus_recv_byte(SBUF0);
        }        
}
#endif


void uart2_init(u32 baud)
{
        MUX_SEL |= 0x40;
        P0MDOUT &= 0xCF;
        P0MDOUT |= 0x10;
        ADCON = 0x80;
        SCON0 = 0x50;
        PCON &= 0x7F;

        baud = 1024-(u16)(3225600.0f/baud);
        SREL0H = (baud>>8)&0xff;  
        SREL0L = baud&0xff;

        #if(1)
                ES0 = 1;
                EA = 1;

        #else
                ES0 = 0;
        #endif

}


void uart2_send_byte(u8 byte)
{
        ES0 = 0;
        SBUF0 = byte;
        while(!TI0);
        TI0 = 0;
        #if(1)
                ES0 = 1;
        #endif
}


void uart2_send_bytes(u8 *bytes,u16 len)
{
        u16 i;

        ES0 = 0;
        for(i=0;i<len;i++)
        {
                SBUF0 = bytes;
                while(!TI0);
                TI0 = 0;
        }
        #if(1)
                ES0 = 1;
        #endif
}



char putchar(char c)
{
        uart2_send_byte(c);

        return c;
}

发送数据给安卓APP的局部代码如下:
u8 buff[200];
void get_str(u8 *val,u8 len)
{
        u8 i;

        for(i=0;i<len;i++)
        {
                if(val==0xff)
                {
                        val = 0x00;
                        val[i+1] = 0x00;
                        return;
                }
        }
}
void start_win_btn_click_handler(u16 btn_val)
{
        if(btn_val==0x01)
        {
                sys_read_vp(0x2100, buff, 50);
                get_str(buff,100);
                uart2_send_bytes(buff, strlen(buff));
        }
}


接受安卓APP的局部代码如下:
void uart2_handler()
{
        if(is_modbus_recv_complete)
        {
                if(modbus_recv_len==33)
                {
                        disp_16x16_char(modbus_recv_buff+1);
                }else
                {
                        modbus_recv_buff[modbus_recv_len++] = 0;
                        modbus_recv_buff[modbus_recv_len++] = 0;
                        sys_write_vp(0x2000, modbus_recv_buff, modbus_recv_len/2+2);
                }
                modbus_recv_len = 0;
                is_modbus_recv_complete = 0;
        }
}



16*16点阵屏显示的局部代码如下:

void disp_16x16_char(u8 *buff)
{
        u8 i,j;
        u16 val;
        u16 pos = 0;
        
        for(i=0;i<32;i++)
        {
                j = 8;
                while(j--)
                {
                        val = (buff>>j)&0x01;
                        sys_write_vp(0x3000+pos, (u8*)&val, 1);
                        pos++;
                }
        }
}



四.安卓APP

工程结构图例如下:

从上面我们可以看出,一个项目下有多个子目录
Src:为源文件目录,即代码文件存放在这里
Gen:在开发项目时,该目录下的R.java文件里内容会动态的变化,主要存放各种资源id
bin:该目录下主要存放一下项目编译过后的文件,即包括啦.apk的安装包
Res:该目录主要存放各种资源,报货图片,音频,字符,颜色....等等
AndroidMenifest.xml:该文件主要是一个对此项目中含有那些组件描述的文件并且还可以在这里改变组件的属性,比如改变我们的应用的名字,以及图标,这里还存放权限等一些重要的东西

桌面界面效果如下:

入口界面如下:

数据收发界面效果如下:

16*16点阵广告屏界面如下:

五.视频演示效果和资料

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

118

回帖

1525

积分

金牌会员

Rank: 6Rank: 6

积分
1525
发表于 2023-11-10 11:57:07 | 显示全部楼层
谢谢楼主分享,学习了。
回复

使用道具 举报

4

主题

6

回帖

511

积分

高级会员

Rank: 4

积分
511
 楼主| 发表于 2023-11-10 16:49:35 | 显示全部楼层
guoqiaoyan 发表于 2023-11-10 11:57
谢谢楼主分享,学习了。

共同进步
回复

使用道具 举报

23

主题

286

回帖

1946

积分

金牌会员

Rank: 6Rank: 6

积分
1946
QQ
发表于 2023-11-10 17:28:17 | 显示全部楼层
优雅 简洁
运动,编程,热爱生活
回复

使用道具 举报

4

主题

6

回帖

511

积分

高级会员

Rank: 4

积分
511
 楼主| 发表于 2023-11-10 19:03:36 | 显示全部楼层
回复

使用道具 举报

0

主题

56

回帖

579

积分

高级会员

Rank: 4

积分
579
QQ
发表于 2023-12-8 08:30:36 | 显示全部楼层
点赞学习!
回复

使用道具 举报

0

主题

6

回帖

751

积分

高级会员

Rank: 4

积分
751
发表于 2023-12-21 16:29:42 | 显示全部楼层
让我叫你一声大佬
回复

使用道具 举报

0

主题

33

回帖

852

积分

高级会员

Rank: 4

积分
852
发表于 2024-1-10 13:39:24 | 显示全部楼层
点赞学习!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-6-26 15:59 , Processed in 0.091987 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表