承接培训第一天: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)