模拟智能家居项目Part2

来自于两周的粤嵌实习,主要是网络编程和线程控制部分比较重要,贯穿了常用的C语言用法,值得做一个复盘,共有11个部分,本节介绍了模拟板使用方法和图片显示。

Posted by LJJ on July 1, 2020

模拟智能家居项目

基本原理

  • 流程

    • 开发板 gec6818的开发板是一种arm板(是一个高级单片机) 芯片采用的是三星公司生产的S5P6818 采用的内核是cortexA53 本次我们采用的是模拟开发板 将模拟开发板的文件放到共享目录 然后根据文件里面的文档操作即可

    • 显示屏的原理 开发板屏幕是由800480个像素点组成,那么分辨率是800480 每个像素点是占32bit,由a r g b 组成,各占8bit a 透明度 r 红色 g 绿色 b 蓝色

    • 量化 8bit 0x00 ~ 0xff 0~255 由浅到深 就是把这个颜色分层次 分等级 通过控制数值的大小来控制颜色的深浅

    • 帧缓冲 帧缓冲设备也是文件,对应的文件位置/dev/ubuntu_lcd

    • 一切皆文件 就是在linux下,一切皆文件

    • linux系统下提供了对文件操作的API函数

       1.open函数 
       头文件
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>
           
       函数原型 
       int open(const char *pathname, int flags);
       函数的功能
       用来打开一个文件的
       函数的参数
       const char *pathname		//带路径的文件名(相对路径,绝对路径)
       int flags					//以何种方式打开这个文件
       O_RDONLY				//以只读的方式打开
       O_WRONLY				//以只写的方式打开
       O_RDWR					//以可读可写的方式打开
           
       函数的返回值
       成功:返回一个文件描述符(>= 0) 非负数,文件描述符就可以理解为那个文件。
       失败:返回-1
           
       2.write函数
       头文件 
       #include <unistd.h>
       函数原型 
       ssize_t write(int fd, const void *buf, size_t count);
       函数的功能 
       将buf指向的内存区域的count个字节数的数据写入到fd(文件描述符)所代表的文件中去
           
       函数的参数 
       int fd				//你要写入到那个文件的文件描述符
       const void *buf		//你要写入到文件中去的数据的数据区域的首地址
       size_t count		//你要写入到文件中去的字节数
       函数的返回值 
       成功:返回写入的字节数
       失败:返回-1
           
       3.close函数
       函数原型 
       int close(int fd);
       函数参数
       int fd		//填你要关闭的那个文件的文件描述符
       返回值:
       成功:返回0
       失败:返回-1
           
       4.lseek函数
       头文件 
       #include <sys/types.h>
       #include <unistd.h>
       函数原型 
       off_t lseek(int fd, off_t offset, int whence);
       函数功能 
       用来定位一个已经打开的文件的光标位置
           
       函数的参数 
       int fd				//你要进行光标定位的文件
       off_t offset		//就是你要偏移的字节数但是必须要集合第三个参数使用
       int whence			//你从文件的哪个位置开始偏移
       SEEK_SET		//从文件的头开始偏移
       SEEK_CUR		//从文件的当前位置开始偏移
       SEEK_END		//从文件的末尾开始偏移
           
       返回值 
       成功:返回从头开始偏移的字节数即光标位置(距离文件的头的字节数)
       失败: 返回-1让屏幕显示大红色
           	
      

实现任务

  • 让屏幕显示大红色

  • 实现步骤如下:

    • 打开帧缓冲设备文件

    • 定义一个800480个int的存储空间,将800480个大红色的颜色值存到这个定义的空间里面

    • 将这个存储颜色值的空间里面的颜色值写到帧缓冲文件中去

    • 关闭帧缓冲文件

  • 让屏幕7种颜色循环显示

    • 需要用到的函数 sleep

实现代码

  • p1

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
      
    int main()
    {
    	// 1.打开帧缓冲设备文件
    	int lcd_fd = open("/dev/ubuntu_lcd",O_RDWR);
    	if(lcd_fd < 0)
    	{
    		printf("open lcd_fd error\n");
    	}
    	// 2.定义一个800*480个int的存储空间,将800*480个大红色的颜色值存到这个定义的空间里面去
    	int buf[480][800] = {0};
    	int i,j;
    	for(i = 0; i < 480; i++)  //行
    	{
    		for(j = 0; j < 800; j++) //列
    		{
    			buf[i][j] = 0x00FF0000;
    		}
    	}
    	// 3.将这个存储颜色值的空间里面的颜色值写到帧缓冲文件中去
    	int ret = write(lcd_fd,buf,800*480*4);
    	if(ret < 800*480*4)
    	{
    		perror("write lcd_fd error\n");
    	}
    	// 4.关闭帧缓冲文件
    	int value = close(lcd_fd);
    	if(value == -1)
    	{
    		printf("close lcd_fd error\n");
    	}
      	
      	
    	return 0;
    }
    
  • p2

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
      
    int main()
    {
      	
    	// 1.定义一个800*480个int的存储空间,将800*480个你要显示的颜色值存到这个定义的空间里面去
    	int buf[480][800] = {0};
    	int color[7] = {0x00FF0000,0x00FFFF00,0x00FF00FF,0x0000FFFF,0x00FFFFFF,0x00000000,0x0000FF00};
    	int i,j,num;
    	for(num = 0; num < 7; num++)  //代表要显示的颜色值
    	{
    		for(i = 0; i < 480; i++)  //行
    		{
    			for(j = 0; j < 800; j++) //列
    			{
    				buf[i][j] = color[num];
    			}
    		}
      		
    		// 2.打开帧缓冲设备文件
    		int lcd_fd = open("/dev/ubuntu_lcd",O_RDWR);
    		if(lcd_fd < 0)
    		{
    			printf("open lcd_fd error\n");
    		}
      		
    		// 3.将这个存储颜色值的空间里面的颜色值写到帧缓冲文件中去
    		int ret = write(lcd_fd,buf,800*480*4);
    		if(ret < 800*480*4)
    		{
    			printf("write lcd_fd error\n");
    		}
      		
      		
    		// 4.关闭帧缓冲文件
    		int value = close(lcd_fd);
    		if(value == -1)
    		{
    			printf("close lcd_fd error\n");
    		}
      		
    		sleep(2);
      		
    	}
      	
      	
      	
      	
    	return 0;
    }