小记
在交叉编译时报错:
test.c: In function 'set_speed':
test.c:20:2: error: 'for' loop initial declarations are only allowed in C99 mode
test.c:20:2: note: use option -std=c99 or -std=gnu99 to compile your code
解决:
我在源代码中 for 循环是这样写的:
for(int i=0;i<sizeof(name_arr)/sizeof(int);i++)
在gcc编译中不会报错,但是交叉编译报错了,修改了写法
int i;
for(i=0;i<sizeof(name_arr)/sizeof(int);i++)
这样交叉编译就可以了
########################分割线############################
交叉编译后,需要从虚拟机中将可执行文件复制到本机下。
然后在将可执行文件复制到ARM中,不能直接从Linux中复制到ARM下。
########################分割线############################
笔记
交叉编译在使用read时报:
使用perror函数打印的(perror函数是打印上一个函数的错误原因)
Resource temporarily unavailable
搜罗了一下
问题来了,阻塞和非阻塞模式是干嘛的?
阻塞是进程的一种状态,由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行.该事件发生前即使把处理机分配给该进程,也无法运行。
这里有一篇讲串口的阻塞和非阻塞模式的博客,挺好:
https://blog.csdn.net/sweetfather/article/details/84938701
整理一下:
########################分割线############################
阻塞操作:
是指在执行设备操作时,若不能获得资源则挂起进程,直到满足可操作的条件后进行操作,
被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足.
非阻塞操作:
进程不能进行设备操作时并不挂起,他或者放弃,或者不停的查询,直到可以进行操作为止.
########################分割线############################
阻塞方式是文件读写操作的默认方式,但是应用程序员可通过使用O_NONBLOCK 标志来人为
的设置读写操作为非阻塞方式 .( 该标志定义在 < linux/fcntl.h > 中,在打开文件时指定 ) .
########################分割线############################
原因:可能是非阻塞模式下使用了阻塞操作;
调用open函数时,使用了非阻塞模式(O_NONBLOCK),却直接用read函数读取;
而read默认为阻塞操作,所以导致报错
解决:可将非阻塞去除,改为阻塞模式;
或者使用select函数给读取加一个超时处理;
//初始化文件指针 这里的argv[1]是 运行./ope /dev/ttyS0 传递的 /dev/ttyS0 打开模式加上O_NDELAY可以以非阻塞方式打开串口
//fd = open(argv[1],O_RDWR | O_NOCTTY| O_SYNC|O_NDELAY);修改前
fd = open(argv[1],O_RDWR | O_NOCTTY| O_SYNC);
########################分割线############################
到这read函数调用正常,下面将read到的内容输出。
nread = read(fd, buff, 32);
if(nread > 0 )
{
printf("\nLen: %d\n",nread);
buff[nread+1] = '\0';
for(i = 0;i<nread; i++)
{
printf(" 0x%02X ",buff[i]);
}
printf("\n");
break;
}
%02x与%2x 之间的区别:
输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(当最小宽度数值以0开头时)。
X 表示以十六进制形式输出
02 表示不足两位,前面补0输出;如果超过两位,则实际输出
举例:
printf("%02X", 0x345); //打印出:345
printf("%02X", 0x6); //打印出:06
而如果直接写为 %2x,数据不足两位时,实际输出,即不额外补0输出; 如果超过两位,则实际输出。
printf("%2X", 0x345); //打印出:345
printf("%2X", 0x6); //打印出:6