软件开发文档.docx

上传人:b****4 文档编号:3002076 上传时间:2022-11-17 格式:DOCX 页数:34 大小:75.32KB
下载 相关 举报
软件开发文档.docx_第1页
第1页 / 共34页
软件开发文档.docx_第2页
第2页 / 共34页
软件开发文档.docx_第3页
第3页 / 共34页
软件开发文档.docx_第4页
第4页 / 共34页
软件开发文档.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

软件开发文档.docx

《软件开发文档.docx》由会员分享,可在线阅读,更多相关《软件开发文档.docx(34页珍藏版)》请在冰豆网上搜索。

软件开发文档.docx

软件开发文档

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1