《智能家居》培训第二天------2019-01-06
目录:
一)write和read函数
二)lseek:文件光标重置函数
三)在linux上编译程序
四)使用SecureCRT连接开发板
五)SecureCRT上进行开发板操作
六)主界面制作过程
七)所想
八)总结
一)write和read函数
1)所在头文件:#include<unistd.h>
2)原型:
①ssize_t write(int fd, const void *buf, size_t count);
②ssize_t read(int fd, void *buf, size_t count);
3)参数解释
①int fd:open函数的返回值,比如语句“fd=open("filename",O_WRONLY)”
②void*buf:要从文件写入write\读出read的数据,void*是通用类型,可以接受任何类型的数据,接受的参数为地址(比如放一个数组名,因为数组名代表这个数组的首地址)
③size_t count:size_t是typedef定义的一个类型,单位为字节,字节啊,就是读取的时候是一个一个字节读的,是一个一个字节,是字节哦!
4)作用通俗解释
write:把buf中的前count位数据写入文件fd中
read:把fd文件的前count位数据写入到buf中
5)read函数当fd文件中没有数据时就会截断,意思就是在read函数往后的程序不再执行
二)lseek:文件光标重置函数
1)为何要学习这个函数
我们希望把一张图片显示到开发板屏幕上,那么就需要读取图片每个像素点的信息,然而对于一张图片,其前54B不是像素信息,而是图片本身的信息,比如图片大小之类的信息,不是像素信息,这些是我们不需要的,我们要的是像素点的信息,所以读取的时候不需要读取图片前54个字节的数据
这里我们采用文件光标重置的方法,使得文件读取时从某一固定位置开始读取,因此需要使用到lseek函数
2)所在头文件:#include<sys/types.h>和#include<unistd.h>
3)函数原型:off_t lseek(int fd, off_t offset, int whence);
4)参数解释
①fd和write那些一样都是open文件时的返回值
②offset:光标偏移量
③whence:以何种方法进行偏移
SEEK_SET---以文件开头为起始点,设置offset字节的偏移量
SEEK_CUR---以当前文件光标为起始点,往后设置offset字节的偏移量
SEEK_END---以文件末尾为起始点,设置offset字节的偏移量
5)例子
lseek(fd,54,SEEK_SET);
以文件fd开头为起点,进行54个字节的偏移,也就是把读取起始位置向后移动54个字节
三)在linux上编译程序
1)上一篇文章中的方法是:gcc filename.c -o filename,但其实这是不行的,这样编译产生的文件是Intel处理器的,而我们的开发板的是ARM处理器,所以这样产生的文件是没办法在这个开发板上执行的
2)正确方法:arm-linux-gcc filename.c -o filename 这样产生的就是ARM处理器的文件,演示如下:
四)使用SecureCRT连接开发板
开发板用usb接上电脑,打开SecureCRT,根据以下进行操作,然后点击连接就行啦
端口选择:插入usb后,右键桌面的“我的电脑”→属性→设备管理器→在设备管理器这里查看插入的是哪个com口
五)SecureCRT上进行开发板操作
1)一些命令(和linux一样的我觉得是):
①mkdir filename------创建一个新文件夹filename
②cd filename------切换到filename目录
③rm filename------移除文件filename
④rx filename------上传文件某个文件,将该文件命名为filename,如下图:
⑤chmod 777 filename------修改filename文件的权限(一般上传以后,需要修改该文件的权限才可以执行)
⑥./ filename------执行filename文件
第④~⑥点是主要的把文件传入开发板的操作,rx先上传文件到开发板→chmod修改该文件的权限→./执行该文件使开发板作出相应反应
六)主界面制作过程
1)任务:把一张图片(主界面图)在开发板显示屏上显示
2)实现思路步骤如下图:
3)关键是字节转换和图片屏幕坐标转换,总之整个过程搞了很久,下午吃完饭6点不到一直搞到晚上9点多,最后其实是可以了,是因为开发板接口有问题,导致上传的图片信息出现错误,字节转换写错了,虽然也是使用位运算写的,但是我那个方案不对,得到的图片有问题,背景色不知道为啥变了,不过图片坐标转换屏幕坐标就写对了,也就是说辛苦了一晚上,除了字节转换其他都写出来了哈哈哈,还是蛮开心的!
4)图片坐标与屏幕坐标
①图片坐标是以左下角为原点,屏幕坐标是以左上角为原点,所以要进行坐标转换,也就是信息转换
②以左上角为原点的坐标,y轴往下是正值,不是负值哦
③后来听老师讲了个投机取巧的方法:不需要进行转换,只需要把原来的图片垂直旋转然后直接导入到屏幕就行了!这样一来就不用敲代码转换了,图片是反的屏幕显示出来的就是正的!这都行!真是太聪明了吧!
5)小问题:必须把要的那个图片(图片使用bmp格式)上传到开发板上,不然无法open图片,就无法显示到屏幕上
6)以下是制作过程,可以看到在慢慢变好!最后两张是通过U盘来传文件的,因为开发板接口有问题通过传输线传输的话图片信息会丢失
七)所想
最开心的莫过于最后发现自己晚上的辛苦没有白费,至少都写出来了,除了字节转换,但是方法都是位运算,我觉得再给点时间我也可以想出来的!
那个狮子与小女孩的界面是我中午的时候做的,感觉还挺好看的哈哈哈
嗯第二天学的东西大概就这么多,主要任务就是写好自己的主界面,已经成功嘻嘻,噢对了,还有个小任务,写个彩虹屏幕,emmm我大概写了一下应该就是这样把?
八)总结
1)总结一下从写代码到传入开发板的整个流程
①在windows上写好自己的.c程序(不要在CodeBlocks上写,不然写好的c文件没法在linux上编译,不知道为啥,在notepad++上写就行)
②在linux上编译写好的.c程序
③将编译产生的文件通过SecureCRT传入到开发板上
2)总结下把图片在屏幕上显示的实现逻辑
①打开开发板上的屏幕文件和图片文件(屏幕文件在“dev/fb0/”,图片文件必须必须先上传到开发板,不然无法打开)
②偏移掉图片的文件信息(lseek)
③读取图片数据,存放到一个数组里(read)
④通过位操作把3字节数据转换为4字节数据(在第三天培训的博客中有代码示例)
⑤图片坐标转屏幕坐标(这一步跳过吧,直接把图片垂直反转以后再上传到开发板就行)
⑥把数据写入到屏幕文件中(write)
⑦关闭文件(close)
2019-01-07-20:12:55