static void OnUartData() { // UART receiving buffer: PACKET structure static byte s_uartData[sizeof(PACKET)]; // -1 indicates magic byte not received yet static int s_cbUartData = -1; byte b = UART_RECV(); if (s_cbUartData < 0) { // Not started yet, looking for the magic byte if (b == UART_PACKET_MAGIC) { // Found magic byte, start receiving from next incoming byte s_cbUartData = 0; } } else { // The logic will make sure s_cbUartData is less than UART_PACKET_SIZE here s_uartData[s_cbUartData] = b; s_cbUartData ++; if (s_cbUartData == sizeof(PACKET)) { // Reset packet byte counter for next packet s_cbUartData = -1; OnPacket((const PACKET*)s_uartData); } } }
/*主函数体*/ int main(int argc, char **argv) { int fd; //文件描述符 int err; //返回调用函数的状态 int len; int i; char rcv_buf[200]; char send_buf[30]="**This's a GPS Locator!**\n"; int listen_fd,accept_fd; struct sockaddr_in client_addr; int n; // int nbytes; if(argc != 3){ printf("Usage: %s /dev/ttyS* s-Send/r-Receive\n",argv[0]); return FALSE; } fd = UART_OPEN(fd,argv[1]); //打开串口,返回文件描述符 do{ err = UART_DEFAULT(fd); }while(FALSE == err || FALSE == fd); printf("Port is READY!\n"); if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0) //创建socket { printf("Socket Error:%s\n\a",strerror(errno)); return FALSE; } bzero(&client_addr,sizeof(struct sockaddr_in)); client_addr.sin_family=AF_INET; client_addr.sin_port=htons(MY_PORT); client_addr.sin_addr.s_addr=htonl(INADDR_ANY); n=1; setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int)); //如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0) //Bind { printf("Bind Error:%s\n\a",strerror(errno)); return FALSE; } listen(listen_fd,MAX_CONN_NUM); if(0 == strcmp(argv[2],"s")) { for(i = 0;i < 50;i++) { len = UART_SEND(fd,send_buf,30); if(len > 0) printf("Count.%d :Send data successful!\n",i); else printf("Count.%d :Send data failed!\n",i); sleep(1); } } else if(0 == strcmp(argv[2],"r")) { while (1) //循环读取数据 { accept_fd=accept(listen_fd,NULL,NULL); if((accept_fd<0)&&(errno==EINTR)) continue; else if(accept_fd<0) { printf("Accept Error:%s\n\a",strerror(errno)); continue; } if((n=fork())==0) { /* 子进程处理客户端的连接 */ unsigned int i; for(i=0;i<200;i++){ len = UART_RECV(fd, rcv_buf,MAX_REC_BUFF); if(len > 0) write(accept_fd,rcv_buf,len); else printf("(Time limit)No data now!\n"); } close(accept_fd); exit(0); } else if(n<0) printf("Fork Error:%s\n\a",strerror(errno)); } } else { fprintf(stderr,"Unsupported char:'s' or 'r'\n"); return (FALSE); } UART_CLOSE(fd); close(listen_fd); return 0; }