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

承接培训第一天:zigbee无线传感网实训---linux命令的简单了解(one day)

一、设置共享文件夹
    1、打开VMware菜单栏的虚拟机
    2、选择设置
    3、在选项栏找到共享文件夹
    4、选择总是启用,添加一个新的文件夹
    5、确定
    
二、文件IO
    1、打开文件(open)
         #include <sys/types.h>
         #include <sys/stat.h>
         #include <fcntl.h>

            int open(const char *pathname, int flags);
            int open(const char *pathname, int flags, mode_t mode); //若打开的文件不存在需要新建则需要需要第三个参数
       
                返回值:
                        成功:打开文件的文件描述符
                        失败:-1
                主要参数:
                        pathname --> 文件的路径名
                        flags    --> 打开文件所需要的权限 (O_RDONLY, O_WRONLY, O_RDWR)
                        mode     --> 当打开文件权限是O_CREAT ,创建文件的权重
    2、写文件(wire)
         #include <unistd.h>

            ssize_t write(int fd, const void *buf, size_t count);
        
            返回值:
                    成功:返回实际写入的字节数
                    失败:-1
            
            主要参数:
                    fd         --> 文件描述符
                    buf     -->写文件的缓冲区(你要写入的内容)
                    count      -->写入的字节数
    3、读文件(read)
         #include <unistd.h>

            ssize_t read(int fd, void *buf, size_t count);
            
            返回值:
                    成功:返回实际读到的字节数
                    失败:-1
            
            主要参数:
                    fd         --> 文件描述符
                    buf     -->读文件的缓冲区(你读到的文件内容)
                    count      -->要读的字节数
            
    4、关闭文件(close)
             #include <unistd.h>

                int close(int fd);
                返回值:
                        成功:0
                        失败:-1
                主要参数:
                        fd  --> 文件描述符
                        
    5、控制文件偏移量
        #include <sys/types.h>
        #include <unistd.h>       off_t lseek(int fd, off_t offset, int whence);
            返回值:
                        成功:实际偏移的自己数
                        失败:-1
           主要参数:
                        fd     --> 文件描述符
                        offset -->要偏移的字节数
                        whence -->基准点 SEEK_SET(文件开头)  SEEK_CUR(当前位置) SEEK_END(文件结尾)                
          开发板的使用:
                   1、将两端都是母头的串口线的一端接到开发板的端口,另一端接到电脑的usb转串口线上,use接到电脑的use口
                   2、打开电脑的设备管理器,查看是否有设备异常,如有异常安装驱动人生一键解决,如无异常查看是否有use-to-serial的端口设备
                    3、安装xshell软件
                    4、打开xshell软件-->新建会话-->去一个名字并选择协议SERIAL
                    5、在类别栏选择SERIAL,设置链接属性,选择对应的com口,波特率115200,点击确定连接
                    6、敲一下回车有反馈
                                [root@GEC6818 /]#
                                连接成功
                                或者按下Ctrl+c有反馈
                                连接成功
                    7、检测触摸屏是否有问题
                            输入命令:cat /dev/input/event0
                            点击触摸屏有反馈(乱码):没问题
                补充vi命令:
                    命令模式
                            复制一行: yy
                            复制多好: yny
                            粘贴:     p
                            剪切:     dd
                            查看函数帮助手册:Alt+k
                            返回vi: q
--------------------------------------------------------------------------------
 练习:
1.1、完成对文件的写操作,读一个文件并将其内容打印指终端
写操作:

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

int main(void)
{
    int fd = open("./1.txt", O_RDWR|O_CREAT|O_TRUNC, 0666);
    if(fd == -1)
    {
        perror("打开文件失败:\n");
        exit(0);
    }
    char buf[]={"你好重交物联\n"};
    int ret = write(fd, buf, sizeof(buf));
    if(ret == -1)
    {
        perror("写入失败:\n");
        exit(0);
    }

    close(fd);
    return 0;    
}

1.2完成对文件的读操作,读一个文件并将其内容打印指终端
 读操作:

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

int main(void)
{
	int fd = open("./1.txt", O_RDONLY);
	if(fd == -1)
	{
		perror("打开文件失败:\n");
		exit(0);
	}
	char buf[50]={0};
	int ret = read(fd, buf, sizeof(buf));
	if(ret == -1)
	{
		perror("读取失败:\n");
		exit(0);
	}
	printf("1.txt 里面的内容是: %s\n",buf);
	close(fd);
	return 0;	
}

三、LCD显示
    1、lcd屏对应开发板的设备节点文件是“/dev/fb0”
        若要显示图片或者其他内容对这个节点进行写操作即可
    2、将可执行文件传输到开发板
        a)将开发板接上网线
        b)设置开发板的IP地址
                    ifconfig 
                    
                        eth0      Link encap:Ethernet  HWaddr 7E:82:FE:28:42:01  
                                  inet6 addr: fe80::7c82:feff:fe28:4201/64 Scope:Link
                                  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                                  RX packets:5179 errors:0 dropped:0 overruns:0 frame:0
                                  TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
                                  collisions:0 txqueuelen:1000 
                                  RX bytes:342373 (334.3 KiB)  TX bytes:238 (238.0 B)
                                  Interrupt:80 
                    eth0 --> 网卡名字
                    
                    分配IP地址
                        ifconfig eth0 192.168.1.x
                        分配之后使用ping命令ping一下自己的电脑ip(注意:一定要关闭电脑的防火墙)
                        ping通之后的结果(按Ctrl+c停止)
                        [root@GEC6818 /]#ping 192.168.1.22
                                        PING 192.168.1.22 (192.168.1.22): 56 data bytes
                                        64 bytes from 192.168.1.22: seq=18 ttl=128 time=0.850 ms
                                        64 bytes from 192.168.1.22: seq=19 ttl=128 time=0.660 ms
                                        64 bytes from 192.168.1.22: seq=20 ttl=128 time=0.697 ms
                                        ^C
            tftp软件的使用:
                    飞秋下载tftp软件-->解压--->打开tftp软件-->点击浏览选择你要传输文件的路径
                    --->点击查看确定是否有你要传输的文件--->选择服务器的ip地址192.168.1.*


            
            开发板下载文件
                    在开发板新建一个属于本次实训的目录--->输入命令tftp -g 192.168.1.* -r **(随机设立IP)
                        tftp -g 192.168.1.22(本机IP) -r hello
                        改变文件的权限
                        chmod 777 file(hello)
                        运行:./hello
                        出错:./hello: line 1: syntax error: unexpected "("
                        原因:gcc编译生成的可执行程序只能运行在x86平台,但是开发板是arm平台
                        在arm平台运行程序需要交叉编译工具:
                                    查看Ubuntu是否安装交叉编译工具链:
                                                                    arm-linux-gcc -v=arm-none-linux-gnueabi -v
                                                                    Using built-in specs.
                                                                    COLLECT_GCC=/usr/local/arm/5.4.0/usr/bin/arm-linux-gcc.br_real
                                                                    COLLECT_LTO_WRAPPER=/usr/local/arm/5.4.0/usr/bin/../libexec/gcc/arm-none-linux-gnueabi/5.4.0/lto-wrapper
                                                                    Target: arm-none-linux-gnueabi
                                                                    Configured with: ./configure --prefix=/home/geclab/buildroot-2016.11/output/host/usr --sysconfdir=/home/geclab/buildroot-2016.11/output/host/etc --enable-static --target=arm-none-linux-gnueabi --with-sysroot=/home/geclab/buildroot-2016.11/output/host/usr/arm-none-linux-gnueabi/sysroot --disable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib --with-gmp=/home/geclab/buildroot-2016.11/output/host/usr --with-mpc=/home/geclab/buildroot-2016.11/output/host/usr --with-mpfr=/home/geclab/buildroot-2016.11/output/host/usr --with-pkgversion='Buildroot 2016.11' --with-bugurl=http://bugs.buildroot.net/ --disable-libquadmath --enable-tls --disable-libmudflap --enable-threads --without-isl --without-cloog --with-float=soft --disable-decimal-float --with-abi=aapcs-linux --with-cpu=cortex-a15 --with-float=soft --with-mode=arm --enable-languages=c,c++,fortran --with-build-time-tools=/home/geclab/buildroot-2016.11/output/host/usr/arm-none-linux-gnueabi/bin --enable-shared --disable-libgomp
                                                                    Thread model: posix
                                                                    gcc version 5.4.0 (Buildroot 2016.11)     //编译工具的版本号    
---------------------------------------------------------------------------
练习: 1、将三原色分块显示(横)(竖)
横:

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

int main(void)
{
    //打开LCD屏
    int fd = open("/dev/fb0", O_WRONLY);
    if(fd == -1)
    {
        perror("打开LCD失败:\n");
        exit(0);
    }
    int red = 0x00ff0000;
    int green = 0x0000ff00;
    int blue = 0x000000ff;
    for(int i=0; i<800*160; i++)
        write(fd, &red, 4);
    for(int i=0; i<800*160; i++)
        write(fd, &green, 4);
    for(int i=0; i<800*160; i++)
        write(fd, &blue, 4);


    close(fd);
    return 0;    
}

竖:

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

int main(void)
{
    //打开LCD屏
    int fd = open("/dev/fb0", O_WRONLY);
    if(fd == -1)
    {
        perror("打开LCD失败:\n");
        exit(0);
    }
    int red = 0x00ff0000;
    int green = 0x0000ff00;
    int blue = 0x000000ff;
    for(int i=0; i<480; i++)
    {
            for(int j=0;j<250; j++)
                write(fd, &red, 4);
            for(int j=250; j<500; j++)
                write(fd, &green, 4);
            for(int j=0; j<800; j++)
                 write(fd, &blue, 4);
    }

    close(fd);
    return 0;    
}

LCD显示屏显示颜色所出现的bug(颜色延时出现补全显示屏)

改进:(简单改进方法如下,上面两个程序可按照此方式得以改进)

#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, 准备好蓝色数据
	int32_t blue = 0x000000FF;


	// 4, 铺满整个映射内存
	for(int j=0; j<480; j++)
	{
		for(int i=0; i<800; i++)
		{
			memcpy(p+4*i+800*4*j, &blue, 4);
		}
	}

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

	return 0;	
}

2、将颜色分8个小方块顺时针轮转显示   /*sleep()//s  usleep()//us    延时函数*/ 

#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, 准备好蓝色数据
    int32_t blue = 0x000000FF;
    int32_t green = 0x0000FF00;
    int32_t red = 0x00FF0000;
    int32_t black = 0x00FFFFFF;
    int32_t baise = 0x00000000;
    int32_t zise = 0x00FF00FF;
    int32_t yellow = 0x00FFFF00;
    int32_t color1 = 0x0000FFFF;

    int32_t color[] = {red, green, blue, baise, zise, black, yellow, color1};
    int k = 0;

    // 4, 铺满整个映射内存
    while(1)
    {
        for(int y=0; y<480; y++)
        {
            for(int x=0; x<800; x++)
            {
                if(y<240)
                    memcpy(p+4*x+800*4*y, &color[(x/200+k)%8], 4);
                else
                    memcpy(p+4*x+800*4*y, &color[(7-x/200+k)%8], 4);
            }
        }
        k++;
        sleep(1);
    }
    // 5, 释放资源
    munmap(p, 800*480*4);
    close(lcd);

    return 0;    
}

注:程序运行环境:Linux、Ubuntu、xshell、tftp、LCD开发板’

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

猜你喜欢

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