感谢你的回复,代码其实很简单,功能其实也是对的,就是不用调试。
#pragma inline = forced
void InitModbus(u8 mode )
{
InitGPIOPort(PIN_SendCS, GP_MOD_PP, GP_DINOFF_DF, GP_DBEN_DF, GP_OUT_0 );
//InitGPIOPort(PIN_TXD, GP_MOD_PP, GP_DINOFF_DF, GP_DBEN_DF, GP_OUT_1 );
//InitGPIOPort(PIN_RXD, GP_MOD_IN, GP_DINOFF_DIS, GP_DBEN_EN, GP_OUT_1 );
UART_Open(UART0, 9600);
UART_DisableFlowCtrl(UART0);
//UART0->FUN_SEL = UART_FUNC_SEL_RS485;
UART0->FCR |= UART_FCR_RFITL_4BYTES;
UART0->TOR = (20<<8) | 30; // XX bit
//UART_EnableInt(UART0, UART_IER_RDA_IEN_Msk|UART_IER_RTO_IEN_Msk);
StartRecv();
}
#pragma inline = forced
void Interactive(void) {
static u16 ovt=0;
ovt ++;
//while( UART_GET_INT_FLAG(UART0, UART_ISR_RDA_IF_Msk) ) {
while( !UART_GET_RX_EMPTY(UART0) ) {
u8 dat;
dat = UART_READ(UART0);
if( RecvBuff.len < MODBUS_STREAMMAXLEN ) {
RecvBuff.content[ RecvBuff.len ] = dat;
RecvBuff.len ++;
}
if( PrtlFlag == PRTL_IDLE ) {
PrtlFlag = PRTL_RECV;
}
ovt = 0;
}
//if( UART_GET_INT_FLAG(UART0, UART_ISR_TOUT_IF_Msk) ) {
if( ovt >=2 ) {
if( PrtlFlag == PRTL_RECV ) {
PrtlFlag = PRTL_RECV_OVER;
}
}
if( PrtlFlag == PRTL_RECV_OVER ) {
u8 tmp;
if( unpack() ) {
tmp = ProcPack( (struct CmdDataStruct*)&cmdbuff );
if( tmp == OP_RIGHT ) {
pack();
StartSend();
} else {
StartRecv();
}
} else {
StartRecv();
}
}
if( PrtlFlag == PRTL_SEND ) {
while( !UART_IS_TX_FULL(UART0) ) {
if( SendBuff.index < SendBuff.len ) {
UART_WRITE(UART0, SendBuff.content[SendBuff.index]);
SendBuff.index ++;
}
}
if( UART_IS_TX_EMPTY(UART0) ) {
PrtlFlag = PRTL_SEND_OVER;
SendOverTcnt = 0;
}
}
if( PrtlFlag == PRTL_SEND_OVER ) {
if( SendOverTcnt >= 2 ) {
StartRecv();
} else {
SendOverTcnt ++;
}
}
} |