|
楼主 |
发表于 2008-11-24 16:16:01
|
显示全部楼层
不同的波特率,超时时间我计算过的,对于1200波特率来说,每传送一个字节需要11位(1个起始位+8个数据位+2位停止位)
1200 11
-------------- = ----- ===> x=1000*11/1200=9.2毫秒
1000 x
也就是说在波特率=1200时,传输1个字节至少需要9.2毫秒,而我的超时时间设置=50毫秒,应该足够了。
void USART1_Modbus_Analyze(void)
{
UCHAR i;
SHORT tempData;
USHORT crcData;
if (USART1_receCount> 2)
{
switch (USART1_mscomm_buffer[1])
{
case 1:
if (USART1_checkoutError == 0 && USART1_mscomm_buffer[0] != 0)
{
tempData = (SHORT)(USART1_mscomm_buffer[2]) + 5;
if (USART1_receCount>= tempData && USART1_receCount < MSCOMM_BUFFER_LENGTH)
{
UCSR1B &= ~BIT(7);
crcData = CRC16(USART1_mscomm_buffer,tempData - 2);
if (crcData == (USHORT)(USART1_mscomm_buffer[tempData - 2] << 8) + (USHORT)USART1_mscomm_buffer[tempData - 1])
{
switch (MSCOMM_ID)
{
case enum_POS3000:
case enum_CONFIG_SOFTWARE:
USART0_sendCount = tempData;
for (i = 0 ; i < tempData ; i++)
USART0_send_buffer = USART1_mscomm_buffer;
USART0_Begin_Send();
break;
case enum_DCS_SOFTWARE:
MSCOMM_Cache[MSCOMM_scan_ID].DO = USART1_mscomm_buffer[3];
MSCOMM_Cache[MSCOMM_scan_ID].OnLine_Type = enum_OnLine;
MSCOMM_ack_type = enum_ACK_OK;
/* #ifdef __DEBUG_COUNT__
if (MSCOMM_scan_type == enum_ONLINE_SCAN)
CHB++;
#endif*/
break;
}
}
USART1_receCount = 0;
USART1_checkoutError = 0;
UCSR1B |= BIT(7);
}
}
break;
case 2:
if (USART1_checkoutError == 0 && USART1_mscomm_buffer[0] != 0)
{
tempData = (SHORT)(USART1_mscomm_buffer[2]) + 5;
if (USART1_receCount>= tempData && USART1_receCount < MSCOMM_BUFFER_LENGTH)
{
UCSR1B &= ~BIT(7);
crcData = CRC16(USART1_mscomm_buffer,tempData - 2);
if (crcData == (USHORT)(USART1_mscomm_buffer[tempData - 2] << 8) + (USHORT)USART1_mscomm_buffer[tempData - 1])
{
switch (MSCOMM_ID)
{
case enum_POS3000:
case enum_CONFIG_SOFTWARE:
USART0_sendCount = tempData;
for (i = 0 ; i < tempData ; i++)
USART0_send_buffer = USART1_mscomm_buffer;
USART0_Begin_Send();
break;
case enum_DCS_SOFTWARE:
MSCOMM_Cache[MSCOMM_scan_ID].DI = USART1_mscomm_buffer[3];
MSCOMM_Cache[MSCOMM_scan_ID].OnLine_Type = enum_OnLine;
MSCOMM_ack_type = enum_ACK_OK;
/* #ifdef __DEBUG_COUNT__
if (MSCOMM_scan_type == enum_ONLINE_SCAN)
CHB++;
#endif*/
break;
}
}
USART1_receCount = 0;
USART1_checkoutError = 0;
UCSR1B |= BIT(7);
}
}
break;
case 3:
if (USART1_checkoutError == 0 && USART1_mscomm_buffer[0] != 0)
{
tempData = (SHORT)(USART1_mscomm_buffer[2]) + 5;
if (USART1_receCount>= tempData && USART1_receCount < MSCOMM_BUFFER_LENGTH)
{
UCSR1B &= ~BIT(7);
crcData = CRC16(USART1_mscomm_buffer,tempData - 2);
if (crcData == (USHORT)(USART1_mscomm_buffer[tempData - 2] << 8) + (USHORT)USART1_mscomm_buffer[tempData - 1])
{
switch (MSCOMM_ID)
{
case enum_POS3000:
case enum_CONFIG_SOFTWARE:
USART0_sendCount = tempData;
for (i = 0 ; i < tempData ; i++)
USART0_send_buffer = USART1_mscomm_buffer;
USART0_Begin_Send();
break;
}
}
USART1_receCount = 0;
USART1_checkoutError = 0;
UCSR1B |= BIT(7);
}
}
break;
case 4:
if (USART1_checkoutError == 0 && USART1_mscomm_buffer[0] != 0)
{
tempData = (SHORT)(USART1_mscomm_buffer[2]) + 5;
if (USART1_receCount>= tempData && USART1_receCount < MSCOMM_BUFFER_LENGTH)
{
UCSR1B &= ~BIT(7);
crcData = CRC16(USART1_mscomm_buffer,tempData - 2);
if (crcData == (USHORT)(USART1_mscomm_buffer[tempData - 2] << 8) + (USHORT)USART1_mscomm_buffer[tempData - 1])
{
switch (MSCOMM_ID)
{
case enum_POS3000:
case enum_CONFIG_SOFTWARE:
USART0_sendCount = tempData;
for (i = 0 ; i < tempData ; i++)
USART0_send_buffer = USART1_mscomm_buffer;
USART0_Begin_Send();
break;
case enum_DCS_SOFTWARE:
for (i = 0 ; i < 4 ; i++)
MSCOMM_Cache[MSCOMM_scan_ID].Input_Buffer = (SHORT)(USART1_mscomm_buffer[3 + 2*i] << 8) + (SHORT)(USART1_mscomm_buffer[3 + 2*i+1]);
MSCOMM_Cache[MSCOMM_scan_ID].OnLine_Type = enum_OnLine;
MSCOMM_ack_type = enum_ACK_OK;
/* #ifdef __DEBUG_COUNT__
if (MSCOMM_scan_type == enum_ONLINE_SCAN)
CHB++;
#endif*/
break;
}
}
USART1_receCount = 0;
USART1_checkoutError = 0;
UCSR1B |= BIT(7);
}
}
break;
case 6:
if (USART1_receCount>= 8 && USART1_checkoutError == 0 && USART1_mscomm_buffer[0] != 0)
{
UCSR1B &= ~BIT(7);
crcData = CRC16(USART1_mscomm_buffer,6);
if (crcData == (USHORT)(USART1_mscomm_buffer[6] << 8) + (USHORT)USART1_mscomm_buffer[7])
{
switch (MSCOMM_ID)
{
case enum_POS3000:
case enum_CONFIG_SOFTWARE:
USART0_sendCount = 8;
for (i = 0 ; i < 8 ; i++)
USART0_send_buffer = USART1_mscomm_buffer;
USART0_Begin_Send();
break;
}
}
USART1_receCount = 0;
USART1_checkoutError = 0;
UCSR1B |= BIT(7);
}
break;
case 16:
if (USART1_receCount>= 8 && USART1_checkoutError == 0 && USART1_mscomm_buffer[0] != 0)
{
UCSR1B &= ~BIT(7);
crcData = CRC16(USART1_mscomm_buffer,6);
if (crcData == (USHORT)(USART1_mscomm_buffer[6] << 8) + (USHORT)USART1_mscomm_buffer[7])
{
switch (MSCOMM_ID)
{
case enum_POS3000:
case enum_CONFIG_SOFTWARE:
USART0_sendCount = 8;
for (i = 0 ; i < 8 ; i++)
USART0_send_buffer = USART1_mscomm_buffer;
USART0_Begin_Send();
break;
}
  |
|