软件开发文档.docx
- 文档编号:3002076
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:34
- 大小:75.32KB
软件开发文档.docx
《软件开发文档.docx》由会员分享,可在线阅读,更多相关《软件开发文档.docx(34页珍藏版)》请在冰豆网上搜索。
软件开发文档
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;i buf[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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 开发 文档
![提示](https://static.bdocx.com/images/bang_tan.gif)