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; }
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; }