if(spfd<0) return -1;
tcgetattr(spfd,&oldtio); cfmakeraw(&oldtio); cfsetispeed(&oldtio,B19200); cfsetospeed(&oldtio,B19200); tcsetattr(spfd,TCSANOW,&oldtio); rbuf=hd;
printf(\
retv=read(spfd,rbuf,1); if(retv==-1) perror(\ while(*rbuf!='\\0') { }
for(i=0;i ncount+=1; rbuf++; retv=read(spfd,rbuf,1); printf(\ if(retv==-1) perror(\ } realdata+=(hd[i]-48)*pow(10,ncount-i-1); printf(\ close(spfd); return 0; } 发送程序writetest.c的源码如下: /******************************************************* * Institute of Automation, Chinese Academy of Sciences * File Name: writetest.c * Description: send data to serial * Author: * Date: Xueyuan Nie *******************************************************/ #include int spfd; int main(int argc, char *argv[]) { char fname[16],*sbuf; int sfd,retv,i; struct termios oldtio; spfd=open(\if(spfd<0) { perror(\return -1; } printf(\ tcgetattr(spfd,&oldtio); cfmakeraw(&oldtio); cfsetispeed(&oldtio,B19200); cfsetospeed(&oldtio,B19200); tcsetattr(spfd,TCSANOW,&oldtio); fname[0]='1'; fname[1]='2'; fname[2]='3'; fname[3]='\\0'; sbuf=(char *)malloc(4); strncpy(sbuf,fname,4); retv=write(spfd,sbuf,4); if(retv==-1) perror(\ printf(\ close(spfd); return 0; } 本例程实现:在发送端发送数字123,在接收端接收并显示接收到的数据。 这里请读者注意的是,发送方按字符发送数据,接收方将接收的字符相应的ascii值与字符0所对应的ascii值相减,最终得到实际的十进制数值。 按照前面介绍的方法编译程序,有关如何将可执行文件添加到目标板的方法将在下一小节介绍。 开始运行程序。先在装有Linux的 PC上运行接收程序,然后在S3C4510B上运行发送程序,整个运行的过程如下所示: 在Linux的PC上: root@uClinux nie]# ./recvtest & [1] 2171 [root@uClinux nie]# open /dev/ttyS1: Success ready for receiving data... [root@uClinux nie]# the number received is 1 the number received is 1 the number received is 1 complete receiving the data 123 [1]+ Done ./recvtest 在目标板上: /var/tmp> ./writetest ready for sending data... the number of char sent is 4 这里所举的例子比较简单,旨在为读者介绍最基本的串行通信的步骤,读者可以此为基础,开发出满足自己需求的应用程序来。 7.4.2 socket编程 uClinux本身就是一个网络的产物,它可以从网上供人们自由免费的下载,正是通过很多爱好者利用网络修改,改善Linux,才得到我们现在的uClinux,所以没有网络可以说就看不到今天的uClinux。因此,在学习uClinux的时候,就不能不涉及到网络,而要掌握在uClinux下设计用户应用程序,就必须要学习有关uClinux下的网络编程。本节主要讲述当前在网络编程中被广泛使用的socket。 socket一般被翻译为“套接字”,简而言之就是网络进程中的ID。 其实网络通信,本质就是进程间的通信,在网络中,每个节点都有唯一一个网络地址,即通常说的IP地址,两个进程在通信的时候,必须首先要确定通信双方的网络地址。但是网络地址只能确定进程所在的PC机,然而同一台PC可能有好几个网络进程,只有网络地址是不能够确定到底是哪个进程,所以套接字还需要提供其他信息,那就是端口号,同一台PC机,一个端口号只能分配给一个进程。所以,网络地址和端口号结合在一起,才可以共同确定整个Internet中的一个网络进程。 套接字最常用的有两种:流式套接字(Stream Socket)和数据报套接字(Datagram Socket)。在Linux中,分别称为”SOCK_STREAM”