fprintf():用于文件操作
#include <stdio.h>
int fprintf( FILE *stream, const char *format, ... );
fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件.比如
char name[20] = "Mary";
FILE *out;
out = fopen( "output.txt", "w" );
if( out != NULL )
fprintf( out, "Hello %s\n", name );
函数运行结果是:Hello Mary
补充串口相关API:http://t.csdn.cn/d6cDb
“野指针”不是NULL 指针,是指向“垃圾”内存的指针。“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);
(2)指针p 被free 或者delete 之后,没有置为NULL,让人误以为p 是个合法的指针。
进入超级用户文件:sudo cd root 退出超级用户:su -pi
进入根目录:cd / (显示root bin boot dev etc home lib....)
删除一些不能删除的文件:sudo rm -rf +文件名
删除文件夹(根目录):rm 文件夹名 -rf
文件编译取消数字行:set nonu
shell(壳):shell也是一个应用程序,是提供了去操作内核的工具,我们在终端输入指令的时候,一回车就会启动一个shell,shell吧回车的字符来启动应用程序来运行,来启动内核;
为什么要自己实现驱动:在应用层调用驱动时,需要用到wiringPi库,这是树莓派平台自带的的库,有些平台不一定提供wiringPi库,不像C库是LINUX都自带的标准库;
配置驱动IO口寄存器: GPFSEL0 (0x3f200000):GPIO选择寄存器
GPSET0 (0x3f20001c):GPIO引脚输出寄存器
GPCLR0 (0x3f200028):GPIO引脚输出清除寄存器
history:打开之前输入命令历史记录;
如何配置环境变量 : 第一:echo $PATH:显示当前路径下的环境变量; 一直到/games: 为止 第二: pwd:显示当前文件夹路径名;第三:输入export PATH= /games:+pwd(路径名)
export LD_LIBRARY_PATH:动态链接库文件搜索的目录
配置永久环境变量:vi /home/tang(用户名)/.bashrc
如何写一个shell脚本:建立一个.sh 结尾的文件名 然后在函数里面输入要执行的程序命令
export LD_LIBRARY_PATH="/home/pi/test" //更改当前动态库环境变量
./mainProDy //可执行文件
然后给文件名添加可执行权限:chmod +x start.sh
执行程序 ./start.sh (不是./a.out)
在下载openssl库后编译之前 要先删除原来curl文件夹里面 _install 这个,这样我们调用libcurl库去访问https协议的网址就不会出错了(否者会出现OK=1 报错);
字,字节,位,比特 的区别和内存大小: 1字=2字节; 一个字节=8位(bit);
1 KB = 1024 B(字节);
1 MB = 1024 KB; (2^10 B)
1 GB = 1024 MB; (2^20 B)
1 TB = 1024 GB; (2^30 B)
sizeof和strlen是两个不同的函数:
1、sizeof是C语言中的一个运算符,用于计算数据类型或变量在内存中所占的字节数。例如,sizeof(int)将返回4,因为int类型在大多数系统中占用4个字节。
2、strlen是C语言中的一个函数,用于计算字符串的长度,即字符串中字符的数量,不包括字符串末尾的空字符''。例如,strlen("hello")将返回5,因为字符串"hello"中有5个字符。
3、因此,sizeof和strlen的区别在于,sizeof用于计算数据类型或变量在内存中所占的字节数,而strlen用于计算字符串中字符的数量
libcurl库-跨平台访问网络协议库():
1、需要安装curl-7.71.1tar.bz2然后解压(tar xvf curl-7.71.1tar.bz2);
2、进入curl解压后的文件把库的包开源包配置安装在指定文件夹(./configure --prefix=$PWD/_install)
3、配置完后,make编译( make )
4、编译完后,make install安装拷贝 ( make install )可以看到我们刚开始配置的文件夹_install;
5、根据之前学习树莓派的时候,静态库,动态库那里。如果我们要调用库的时候,要配置环境,仅该终端窗口有用,换个窗口程序就运行不起来了。想要永久有效,vi /home/tang(用户名)/.bashrc 文件下添加 export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib (也可以直接临时窗口使用)
export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib
6、编译程序运行(gcc demo1.c(文件名) -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl ) 需要连接头文件和库
gcc renlian1.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
安装摄像头 openssl 库(libcurl库需要支持https协议的话,要装上openssl这个库):
1、在下载openssl库后编译之前 要先删除原来curl文件夹里面 _install 这个,这样我们调用libcurl库去访问https协议的网址就不会出错了(否者会出现OK=1 报错);
2、解压openssl库(tar xvf openssl-1.1.1a.tar.gz)
3、进入到解压后openssl文件夹里面安装库(./config )
4、当前文件夹编译( make )
5、安装(sudo make install)
6、进入到curl文件里编译 libcurl库加上openssl 库 (./configure --prefix=$PWD/_install -- with-ssl)
7、make
8、make install
编译gcc的时候报错:
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_keylog_callback@OPENSSL_1_1_1'
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_post_handshake_auth@OPENSSL_1_1_1'
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_ciphersuites@OPENSSL_1_1_1'
解决办法:gcc 后面加上 -lssl -lcrypto
gcc renlian1.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl -lssl -lcrypto
执行程序./a.out报错openssl: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found :解决办法
echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/lib
打开树莓派摄像头:
1、确认摄像头是否有用(vcgencmd get_camera)
2、sudo raspi-config 选择 1 5 后重启
3、启动摄像头,到所在mjpg-streamer文件夹(./start.sh)
4、摄像头拍照命令:(raspistill -o image.jpg(保存的图片文件名))
5、网页查看:默认访问地址是 http://<树莓派IP>:8080
gcc input.h shexiangtou.c yushideng.c erlou.c yuying.c fengminqi.c lock.c device.h huoyan.c mainpro.c sanlou.c socket.c yilou.c -lwiringPi -lpthread -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
vi编译出现不能修改的问题:在编译页面输入以下内容
:set fileencoding=utf-8