zigbee无线传感网实训---LCD显示bmp图片及一些简单的c语言编程功能( On the third day)

承接实训第二天:zigbee无线传感网实训---读、写文件操作以及LCD显示屏显示颜色(two day)

一、bmp图片的显示
1、内存映射(给开发板的LCD屏分配显存)mmap
    #include <sys/mman.h>
    void *mmap(void *addr,    //映射内存的起始地址
        size_t length,  //映射内存大小
        int prot,     //映射的方式(以什么方式操作映射内存)   PROT_EXEC  PROT_READ PROT_WRITE PROT_NONE  
        int flags,    //映射内存权限(其他进程和线程访问权限) MAP_SHARED   MAP_PRIVATE
        int fd,        //映射设备的文件描述符
        off_t offset    //映射内存与LCDD的偏移量,0代表完全重合
        );
    返回值:
        成功:返回指向该映射内存首地址的指针
        失败:返回NULL
    
2、解除映射        
    int munmap(void *addr,    //映射内存的地址
        size_t length);   //映射内存的大小

    返回值:
        成功:0
        失败:-1
3、内存拷贝
    #include <string.h>    void *memcpy(void *dest,    //目标内存地址
        const void *src,   //源内容的地址
        size_t n       //拷贝的字节数
        );
    补充: 
        永久配置开发板的ip:
        使用vi编辑器更改/etc/profile文件

在最后一行加上ip分配即可(ifconfig eth0 192.168.1.*)
        若要屏蔽“物联网系统”使用“#”注释掉“cd /IOT”及“./iot &”后面可添加切换到工作路径“cd /**”


        重启开发板“reboot”
            -std=c99
练习:
1、通过编程实现与在命令窗口的cp(复制)功能相同的程序代码(copy.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    if(argc<3)
    {
        printf("参数不够!\n");
        exit(0);
    }
    int fd1 = open(argv[1], O_RDWR);
    int fd2 = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0666);
    if(fd1 == -1 || fd2==-1)
    {
        perror("打开文件失败:\n");
        exit(0);
    }
    char buf[1024];
    int ret = 1;
    int k=0;
    while(ret)
    {
        //清空缓冲区
        memcpy(buf, &k, sizeof(buf));
        ret = read(fd1, buf, sizeof(buf));
        if(ret>0)
        {
            write(fd2, buf, ret);
        }
        if(ret<0)
        {
            break;
        }
    }

    close(fd1);
    close(fd2);
    return 0;    
}

2、实现将bmp图片显示在开发板的显示屏上(show_bmp.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char **argv)
{
    int lcd = open("/dev/fb0", O_RDWR);

    if(lcd == -1)
    {
        perror("打开LCD失败");    
        exit(0);
    }

    // 2, 映射一块恰当大小的内存
    char *p = mmap(NULL, // 不指定映射内存的位置,让系统自动选取
               800*480*4, // 映射内存的大小
               PROT_READ | PROT_WRITE, // 以读、写模式操作映射内存
               MAP_SHARED, // 其他线程、进程可以共享访问这块内存
               lcd, // LCD文件描述符
               0    // 映射内存与LCD的偏移量,0代表完全重合
               );

    // 3, 准备数据
    if(argc < 2)
    {
        printf("参数不对!\n");
        close(lcd);
        munmap(p, 800*480*4);
        exit(0);
    }
    int bmp =  open(argv[1], O_RDONLY);
    if(bmp == -1)
    {
        perror("打开图片失败!");
        close(lcd);
        munmap(p, 800*480*4);
        exit(0);    
    }
    char bmp_buf[800*480*3];
    
    int ret = read(bmp, bmp_buf, sizeof(bmp_buf));
    if(ret <= 0)
    {
        perror("读取bmp数据失败!");
        close(lcd);
        close(bmp);
        munmap(p, 800*480*4);
        exit(0);
    }
    int lcd_buf[800*480];
    // 4, 铺满整个映射内存
    for(int i=0; i<800*480; i++)
    {
        lcd_buf[i]=bmp_buf[i*3] | bmp_buf[i*3+1]<<8 | bmp_buf[i*3+2]<<16;
    }

    for(int y=0; y<480; y++)
    {
        for(int x=0; x<800; x++)
        {
            memcpy(p+4*x+800*4*y, &lcd_buf[x+(479-y)*800], 4);
        }
    }

    // 5, 释放资源
    munmap(p, 800*480*4);
    close(lcd);

    return 0;    

步骤:

(1)编译程序:

(2)打开tftp

(3)在开发板上下载编译程序并执行

(4)效果显示

3、计算数据类型所占字节(size.c)

#include <stdio.h>

int main(void)
{

    printf("int32_t size: %lu\n", sizeof(int));
    printf("char size: %lu\n", sizeof(char));
    printf("float size: %lu\n", sizeof(float));
    printf("double size: %lu\n", sizeof(double));
    return 0;
}

4、两数相加(sum.c)

#include <stdio.h>
#include <stdlib.h>

int fun(int a, int b)
{
    return a+b;
}

int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for(int i=0; i<argc; i++)
    {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    int sum = fun(atoi(argv[1]),atoi(argv[2]));
    
    printf("sum = %d\n",sum);
    return 0;
}


    

注:习题2中存在bug,将在第四天解决。

        实训第四天将学习:在LCD屏上显示JPG图片、 触摸屏、相册:zigbee无线传感网实训---在LCD屏上显示JPG图片、 触摸屏、相册(The fourth day)

猜你喜欢

转载自blog.csdn.net/myclass1312/article/details/82467242