Ejemplo n.º 1
0
Archivo: uart.cpp Proyecto: HclX/MSP430
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);
        }
    }
}
Ejemplo n.º 2
0
 /*主函数体*/
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;
}