急! 菜鸟在线求助,请高手帮忙看段代码,有关串口数据接收及处理的。
for(;;){
//Wait Until Data Recving
if(iPos==m_i485Buf){
Textout("485 Buffer is Empty, Wait\0");
while(iPos==m_i485Buf)
#if 1
tm_wkafter(timeout);
#else
tm_wkafter(10);
#endif
Textout("485 Buffer Has Some Data, Continue\0");
}
//---------------------------
#ifdef MAC_SDA /*2006-02-17*/
ch1 = (unsigned char)m_p485Buf[iPos];
switch(ch1){
case cmdRTS:
Textout("RECV RTS, Will SendBack RTR!\0");
Enable485Read(False);
memset(szTmp, 0, 8); szTmp[0] = cmdRTR;
uartWrite(port485, (char*)szTmp, 1);
sm_p(switchwrite_ok, SM_WAIT, 0);
Enable485Read(True);
bAllowData = True;
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdRTR:
Textout("RECV RTR!\0");
ev_send(tid_cmdProcessor, EV_Recv_RTR);
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdACK:
Textout("RECV ACK!\0");
ev_send(tid_cmdProcessor, EV_Recv_ACK);
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdNAK:
Textout("RECV NAK!\0");
ev_send(tid_cmdProcessor, EV_Recv_NAK);
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdData:
if(bAllowData)
break;
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
default:
Textout("FLAG Char is UnValid!(NOT A1/RTS/RTR/ACK/NAK) Skip it!!!\0");
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
}
#endif
//---------------------------
//Wait Until Data Head Recved
//if Special Time, Has No Data, Means 485Port Error, Skip All !!!
bDataOK = False;
while(!bDataOK){
if(iPos>m_i485Buf){
#ifdef MAC_SDA /*2006-02-17*/
if((BUFSIZE485+m_i485Buf-iPos)>=HEAD_LEN+1)
#else
if((BUFSIZE485+m_i485Buf-iPos)>=HEAD_LEN)
#endif
bDataOK = True;
}
else{
#ifdef MAC_SDA /*2006-02-17*/
if((m_i485Buf-iPos)>=HEAD_LEN+1)
#else
if((m_i485Buf-iPos)>=HEAD_LEN)
#endif
bDataOK = True;
}
if(!bDataOK){
#if 1
ev_receive(EV_485Busy, EV_NOWAIT|EV_ANY, 0, &events_r);
events_r = 0;
ev_receive(EV_485Busy, EV_WAIT|EV_ANY, timeout, &events_r);
if(events_r == 0){
Textout("Timeout When Recv Data Head, Skip All\0");
break;
}
#else
tm_wkafter(10);
#endif
}
}
if(!bDataOK){
iPos = m_i485Buf;
continue;
}
Textout("485 Buffer Has a Command Head, Check\0");
#ifdef HAS_TEXTOUT
sprintf(dbuf, "Command Head=0x%02X%02X%02X%02X\0",
m_p485Buf[iPos+0],
(iPos+1 >= BUFSIZE485)?m_p485Buf[iPos+1-BUFSIZE485]:m_p485Buf[iPos+1],
(iPos+2 >= BUFSIZE485)?m_p485Buf[iPos+2-BUFSIZE485]:m_p485Buf[iPos+2],
(iPos+3 >= BUFSIZE485)?m_p485Buf[iPos+3-BUFSIZE485]:m_p485Buf[iPos+3]);
Textout(dbuf);
#endif
//Make sure First Char is Valid Command FLAG
ch1 = (unsigned char)m_p485Buf[iPos];
if(ch1 != cmdData){
Textout("Fist Char is UnValid!!! Skip it!!!\0");
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
}