文件I/O编程之: 实验内容
(2)编写代码。
编写宿主机和目标板上的代码,在这些程序中用到的open_port()和set_com_config()函数请参照6.4节。这里只列出宿主机上的代码。
/*com_host.c*/
#includestdio.h>
#includestdlib.h>
#includeunistd.h>
#includestring.h>
#includefcntl.h>
#includesys/types.h>
#includesys/stat.h>
#includeerrno.h>
#includeuart_api.h
intmain(void)
{
intfds[SEL_FILE_NUM],recv_fd,maxfd;
charbuff[BUFFER_SIZE];
fd_setinset,tmp_inset;
structtimevaltv;
unsignedloop=1;
intres,real_read,i;
/*将从串口读取的数据写入这个文件中*/
if((recv_fd=open(RECV_FILE_NAME,O_CREAT|O_WRONLY,0644))0)
{
perror(open);
return1;
}
fds[0]=STDIN_FILENO;/*标准输入*/
if((fds[1]=open_port(HOST_COM_PORT))0)/*打开串口*/
{
perror(open_port);
return1;
}
if(set_com_config(fds[1],115200,8,'N',1)0)/*配置串口*/
{
perror(set_com_config);
return1;
}
FD_ZERO(inset);
FD_SET(fds[0],inset);
FD_SET(fds[1],inset);
maxfd=(fds[0]>fds[1])?fds[0]:fds[1];
tv.tv_sec=TIME_DELAY;
tv.tv_usec=0;
printf(Inputsomewords(enter'quit'toexit):n);
while(loop(FD_ISSET(fds[0],inset)||FD_ISSET(fds[1],inset)))
{
tmp_inset=inset;
res=select(maxfd+1,tmp_inset,NULL,NULL,tv);
switch(res)
{
case-1:
{
perror(select);
loop=0;
}
break;
case0:/*Timeout*/
{
perror(selecttimeout);
loop=0;
}
break;
default:
{
for(i=0;iSEL_FILE_NUM;i++)
{
if(FD_ISSET(fds[i],tmp_inset))
{
memset(buff,0,BUFFER_SIZE);
/*读取标准输入或者串口设备文件*/
real_read=read(fds[i],buff,BUFFER_SIZE);
if((real_read0)(errno!=EAGAIN))
{
loop=0;
}
elseif(!real_read)
{
close(fds[i]);
FD_CLR(fds[i],inset);
}
else
{
buff[real_read]=' ';
if(i==0)
{/*将从终端读取的数据写入串口*/
write(fds[1],buff,strlen(buff));
printf(Inputsomewords
(enter'quit'toexit):n);
}
elseif(i==1)
{/*将从串口读取的数据写入普通文件中*/
write(recv_fd,buff,real_read);
}
if(strncmp(buff,quit,4)==0)
{/*如果读取为‘quit’则退出*/
loop=0;
}
}
}/*endofifFD_ISSET*/
}/*fori*/
}
}/*endofswitch*/
}/*endofwhile*/
close(recv_fd);
return0;
}
(3)接下来,将目标板的串口程序交叉编译,再将宿主机的串口程序在PC机上编译。
(4)连接PC的串口1和开发板的串口2。然后将目标板串口程序下载到开发板上,分别在两台机器上运行串口程序。
4.实验结果
宿主机上的运行结果如下所示:
$./com_host
Inputsomewords(enter'quit'toexit):
Hello,Target!
Inputsomewords(enter'quit'toexit):
Imhostprogram!
Inputsomewords(enter'quit'toexit):
Byebye!
Inputsomewords(enter'quit'toexit):
quit/*这个输入使双方的程序都结束*/
从串口读取的数据(即目标板中发送过来的数据)写入同目录下的recv.dat文件中。
$catrecv.dat
Hello,Host!
Imtargetprogram!
Byebye!
目标板上的运行结果如下所示:
$./com_target
Inputsomewords(enter'quit'toexit):
Hello,Host!
Inputsomewords(enter'quit'toexit):
Imtargetprogram!
Inputsomewords(enter'quit'toexit):
Byebye!
与宿主机上的代码相同,从串口读取的数据(即目标板中发送过来的数据)写入同目录下的recv.dat文件中。
$catrecv.dat
Hello,Target!
Imhostprogram!
Byebye!
Quit
请读者用poll()函数实现具有以上功能的代码。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论