软件开发文档.docx
《软件开发文档.docx》由会员分享,可在线阅读,更多相关《软件开发文档.docx(34页珍藏版)》请在冰豆网上搜索。
![软件开发文档.docx](https://file1.bdocx.com/fileroot1/2022-11/16/1ee4ccce-dc6a-4940-b1cf-7e2278a6e9b5/1ee4ccce-dc6a-4940-b1cf-7e2278a6e9b51.gif)
软件开发文档
1机器人网络控制服务器
机器人网络控制服务器的实现主要由两个文件,即server.c和robotcommand.c来完成。
server.c负责建立服务器与客户机间的连接,以及客户机发送命令的解析。
robotcommand.c则完成具体命令的执行,以及同机器人运动控制与传感单元的交互。
1.1server.c
/*****server.c*****/
#include
#include
#include
#include
#include
#include
#include
#include
#include"serial.h"
#include"robotcommand.h"#defineSERVPORT3333/*服务器要监听的本地端口*/
#defineBACKLOG10/*能够同时接受多少没有accept的连接*/
#defineMAXDATASIZE255/*服务器一次读取的最大字节数*/
voidchild_process(void);/*完成客户机命令的读取与解析*/
voidcommand_process(unsignedchar*);/*调用各命令处理函数*/
intmysockfd;//定义一个全局的socket描述符,将代表建立好的连接
main()
{
intsockfd,sin_size;/*定义两个局部的socket描述符*/
structsockaddr_inmy_addr;/*用于填写本地主机的地址信息*/
structsockaddr_inremote_addr;/*用于填写客户机的地址信息*/
charbuf[MAXDATASIZE];
charopt;
intlen;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socketcreateerror锛?
);exit
(1);
}
opt=1;len=sizeof(opt);/*设定参数数值*/
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);
/*设置套接字属性,必须要这样做,否则服务器关闭一次后,再次打开时,Linux系统将提示该端口已被占用,导致服务器无法运行*/
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))==-1){
perror("binderror锛?
);
exit
(1);
}
if(listen(sockfd,BACKLOG)==-1){
perror("listenerror锛?
);
exit
(1);
}
while
(1){
sin_size=sizeof(structsockaddr_in);
if((mysockfd=accept(sockfd,(structsockaddr*)&remote_addr,&sin_size))==-1){
perror("accepterror");
continue;
}
printf("receivedaconnectionfrom%s\n",inet_ntoa(remote_addr.sin_addr));
if(!
fork()){/*建立子进程*/
child_process();/*调用该函数来完成命令的接收与解析*/
close(mysockfd);/*关闭套接字*/
exit(0);
}
close(mysockfd);/*关闭套接字*/
}
close(sockfd);/*关闭套接字*/
}
voidchild_process(void)
{
unsignedcharbuf[6];
unsignedchardata[MAXDATASIZE];
intrecvbytes,nread,i;
unsignedxorcheck=0;
unsignedcharcompleteflag;
while
(1)
{
recvbytes=0;
nread=0;
while(nread<6)/*读取6个字节*/
{
if((recvbytes=recv(mysockfd,data,6-nread,0))==-1)
{
perror("recverror\n");
}
for(i=0;ibuf[nread++]=data[i];
}
printf("read%d\n",nread);
xorcheck=(buf[2]^buf[3]^buf[4]);/*异或校验*/
/*判断是否为合法命令*/
if(buf[0]==0xfe&&buf[5]==0xff&&buf[1]==xorcheck)
{
command_process(buf+2);/*调用命令处理函数*/
completeflag=1;
/*向客户端返回1,表示命令执行完毕*/
if(send(mysockfd,&completeflag,1,0)==-1)
{
perror("send1error\n");
break;
}
printf("send1success\n");
}
else
{
completeflag=0;
/*向客户端返回0,表示命令执行失败*/
if(send(mysockfd,&completeflag,1,0)==-1)
{
perror("send0error\n");
break;
}
printf("send0success\n");
}
xorcheck=0;
}
}
voidcommand_process(unsignedchar*buf)
{
if(buf[0]<0x60)/*二级命令*/
command_send(buf);
else
{
switch(buf[0])/*一级命令*/
{
case0x62:
robot_run();
break;
case0x63:
robot_stop();
break;
case0x64:
robot_stat(mysockfd);
break;
default:
break;
}
}
}
1.2robotcommand.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"robotcommand.h"
#include"serial.h"
#defineCONFIG97
#defineRUN98
#defineSTOP99
#defineREQUEST100
/*对二级命令的处理*/
voidcommand_send(unsignedchar*command_buf)
{
intfd2,i;
unsignedcharreadchar,writechar;
unsignedcharcheckbuf[3];
unsignedcharreceivechar;
for(i=0;i<3;i++)
printf("%d",command_buf[i]);
fd2=OpenComPort(2,57600,8,"1",'N');
if(fd2<0)
{
printf("Makesure/dev/ttyS2notinuseoryouhaveenoughprivilege");
}
else
{
printf("open/dev/ttyS2success");
WriteComPort(fd2,"a",1);
fflush(stdout);
readchar=ReadComPort(fd2,&receivechar,1);
writechar=WriteComPort(fd2,command_buf,3);
fflush(stdout);
if(readchar==1&&receivechar=='a'&&writechar==3)
{
printf("command_send:
success");
readchar=ReadComPort(fd2,checkbuf,3);
if(readchar==3)
printf("cmd_u=%d,cmd_h=%d,cmd_l=%d",
checkbuf[0],checkbuf[1],checkbuf[2]);
while
(1)
{
readchar=ReadComPort(fd2,&receivechar,1);
/*收到底层返回的0xff,则表示命令执行完毕*/
if(readchar==1&&receivechar==0xff)
{
printf("commandcomplete");
break;
}
}
}
else/*没有收到底层返回的'a',则表示命令处理失败*/
printf("command_send:
fail");
CloseComPort(fd2);
}
}
/*对状态查询命令的处理*/
voidrobot_stat(intsockfd2)
{
unsignedcharrobotstat_buf[36];
intfd2,i,channel;
INT32readchar;
fd2=OpenComPort(2,57600,8,"1",'N');
if(fd2<0)
{
printf("Makesure/dev/ttyS2notinuseoryouhaveenoughprivilege");
}
else
printf("open/dev/ttyS2success");
WriteComPort(fd2,"d",1);
fflush(stdout);
readchar=Re