Example #1
0
int RS232Check(serial_driver_t *rs)
{
	int waitingChars = 0;
	char buf[MaxLen];
	int len = 0;
	int i = 0;
	/*sleep(1);
	char Sender[SENDER_LEN];
	//获取发送方ip and port
	memset(Sender, 0, SENDER_LEN);
	memcpy(Sender, (void*)&rs, sizeof(rs));
	SendRSData(buf,4, Sender);*/


	if((waitingChars = rs->poll()) == 0) return 0;

	//DBPRINTF("---Begin poll size:%d   %d\n",waitingChars,COMMBUFLEN_MAX_RS485_232);

	memset(buf,0x00,MaxLen);
	//接收完所有数据,考虑中间中断等,须分多次接收
/*	do
	{
		if(len >= COMMBUFLEN_MAX_RS485_232)
		{
			printf("------RS232Check:Get data len  = %d\n",len);
			break;
		}

		waitingChars = rs->read_buf(buf+len,waitingChars);
		len += waitingChars;

		// 如果是9600, 传输1 byte,约要1ms,
		mmsleep(10);
		//DBPRINTF("Get data  packet len  = %d\n",len);
		waitingChars=rs->poll();
		if(waitingChars > 0)
		{
			i = 5;
		}
		else
		{
			mmsleep(10);
			i--;
		}
	}
	while(i);

	printf("RS232Check:Get data len  = %d\n",len);
*/
	TC3Cmdstruct c3buf;
	int result;
	char sendbuf[MaxLen];
	int sendlen = 0;

	memset(sendbuf, 0 , sizeof(sendbuf));
	i = 5;
	while(i--)
	{
		len = RS232WaitRespose(rs,gOptions.DeviceID,buf,200);
		printf("len %d\n",len);
		//len = 8;
		//buf[0]=0xaa;buf[1]=0x01;buf[2]=0x01;buf[3]=0x00;buf[4]=0x00;buf[5]=0x50;buf[6]=0x3c;buf[7]=0x55;
		if(0 > len)
		{
			return 0;
		}
		memset(&c3buf, 0, sizeof(TC3Cmdstruct));
		DEBUGTRACE(buf,len);
		result = Process_ReceiveData(buf,len,&c3buf.framehead,RS485_232_MODE);

		if(result==  EC_FINISH)
		{
			printf("c3 cmd = %d,data's len = %d \n ",c3buf.command,c3buf.datalen);
			BYTE currcmd = c3buf.command;
	//		if(process_comm_cmd(&c3buf.command,c3buf.buf,c3buf.datalen,sendbuf,&sendlen,RS485_232_MODE) == CMD_SUCCESS)
			process_comm_cmd(&c3buf.command,c3buf.buf,c3buf.datalen,sendbuf,&sendlen,RS485_232_MODE) ;
			{
	//			if(currcmd == c3buf.command)
	//				c3buf.command = 200;//命令执行成功
				c3buf.datalen = sendlen;//
				if(sendlen)
					memcpy(c3buf.buf,sendbuf,sendlen);
				Make_SendData(c3buf.buf,c3buf.command,c3buf.datalen,sendbuf,&sendlen);

				char Sender[SENDER_LEN];
				//获取发送方ip and port
				memset(Sender, 0, SENDER_LEN);
				memcpy(Sender, (void*)&rs, sizeof(rs));
				SendRSData(sendbuf,sendlen, Sender);
				printf("Rs232 runcommcmd OK ! sendlen = %d \n ",sendlen);
				return 0;
			}
	//		else
	//			printf("RS232 runcommcmd error ! \n ");
		}
		else
		{
			printf("-RS232Check error = 0x%x,\n", 	result);
		}
	}
	return -1;
}
Example #2
0
int RS232Check(serial_driver_t *rs)
{
	int i, j;
	U32 ch,sum;
	TMyBuf *packet;
	PRSHeader pch;
	
	if(rs->poll()==0) return 0;
	i=0;sum=0;
	packet=bget(0);
	pch=(PRSHeader)(packet->buf);
	rsc++;
	while(1)
	{
		j=200;
		while(rs->poll()==0) 
		{
			DelayUS(2000);
			if(++j>=220) 
			{
				if(i>8)	//FIFO溢出,要求重发
				{
					PCmdHeader chdr=(PCmdHeader)(packet->buf+sizeof(TRSHeader));
					PCommSession session=GetSession(chdr->SessionID);
					if(session)
					{
						chdr->Command=CMD_ACK_RETRY;
						chdr->CheckSum=0;
						chdr->CheckSum=in_chksum((BYTE*)chdr,sizeof(TCmdHeader));
						session->Send((char *)chdr,sizeof(TCmdHeader),session->Sender);
						PS1[PSIndex]=i;
						PS2[PSIndex++]=rsc;
						PSIndex &= 0xFF;
						j=0;	//等待重发
						i=0;
						sum=0;
						continue;
					}
				}
//				ExBeep(5);
				return -1;
			}
		}
		ch=rs->read();
		packet->buf[i]=ch;
		if(i<=1)
		{
#ifdef MAIN_PRG
			if(rs==&st232 && (ch!=(U32)THEDID)) break;
#endif
		}
		else if(i==3)
		{
			if(pch->Cmd+pch->CmdCheck!=0xFF) break;
			if(pch->Cmd!=CMD_RS) break;
		}
		else if(i==sizeof(TRSHeader)-1)
		{
			if(pch->Len>BUFSZ-sizeof(TRSHeader)) break;
		}
		else if(i==(int)(pch->Len+sizeof(TRSHeader)-1))
		{
			sum=pch->CheckSum;
			pch->CheckSum=0;
			if(sum==in_chksum(packet->buf, pch->Len+sizeof(TRSHeader)))
			{
				PCommSession session;
				int cmd=RunCommand(packet->buf+sizeof(TRSHeader), pch->Len);
				if(cmd==0) return -2;
				if(cmd==CMD_CONNECT)
				{
					char Sender[SENDER_LEN];
					PCmdHeader chdr=(PCmdHeader)(packet->buf+sizeof(TRSHeader));
					memset(Sender, 0, SENDER_LEN);
					memcpy(Sender, (void*)&rs, sizeof(rs));
					session=CreateSession(Sender);
					chdr->SessionID=session->SessionID;
					chdr->CheckSum=0;
					chdr->CheckSum=in_chksum((void*)chdr,sizeof(TCmdHeader));
					session->Send=SendRSData;
					session->Speed=THEBR;
					SendRSData((void*)chdr, sizeof(TCmdHeader), Sender);
				}
				else if(CMD_RESTART==cmd)
					SetPC(0);		
//				while(rs->poll()) ch=rs->read();
			}
			return pch->Cmd;
		}
		i++;
	}
	while(rs->poll()) ch=rs->read();
//	ExBeep(5);DelayUS(100000);ExBeep(5);
	return -1;	
}