Bläddra i källkod

修改t1.5-t3.5间隔判断代码

main
the_deepest 2 dagar sedan
förälder
incheckning
bd9fb51657
6 ändrade filer med 989 tillägg och 960 borttagningar
  1. +32
    -8
      app/inc/hardware.h
  2. +6
    -6
      iar/settings/F407_uCOSii_Modbus.wsdt
  3. +1
    -1
      iar/settings/uCOS_Modbus.dnx
  4. +943
    -944
      iar/uCOS_Modbus.dep
  5. +1
    -1
      modbus/modbus_parse.c
  6. +6
    -0
      modbus/modbus_rec_send.c

+ 32
- 8
app/inc/hardware.h Visa fil

@@ -3,6 +3,33 @@


#include"modbus_parse.h" #include"modbus_parse.h"



// #if (MODBUS_USART_BAUDRATE > 19200U)

// /*固定等待1750us,再减去IDLE中断等待的1个字符时间*/
// /*1.5个字符=750us-1个字符时间*/
// #define MODBUS_IDLE_TO_T15_US \
// ((750UL * MODBUS_USART_BAUDRATE - 10000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
// /*2个字符=1000us*/
// #define MODBUS_T15_TO_T35_US 1000UL
// /*3.5个字符=1750us-1个字符时间*/
// #define MODBUS_IDLE_TO_T35_US \
// ((1750UL * MODBUS_USART_BAUDRATE - 10000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
// #else

// /*IDLE中断已经过了1个字符的时间,还需等待2.5个字符*/
// /*1.5个字符-1个字符时间=0.5个字符时间*/
// #define MODBUS_IDLE_TO_T15_US \
// ((5000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
// /*2个字符时间*/
// #define MODBUS_T15_TO_T35_US \
// ((20000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
// /*3.5个字符-1个字符时间=2.5个字符时间*/
// #define MODBUS_IDLE_TO_T35_US \
// ((25000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
// #endif


/*在8N1下,一个字符=10位,波特率表示每秒传输的位数,换算成每us传输的位数要除以10^6 /*在8N1下,一个字符=10位,波特率表示每秒传输的位数,换算成每us传输的位数要除以10^6
*所以一个字符时间 = 10/(波特率/10^6)=10^7/波特率 *所以一个字符时间 = 10/(波特率/10^6)=10^7/波特率
*(+ MODBUS_USART_BAUDRATE - 1UL)部分为整数运算向上取整 *(+ MODBUS_USART_BAUDRATE - 1UL)部分为整数运算向上取整
@@ -11,28 +38,25 @@


/*固定等待1750us,再减去IDLE中断等待的1个字符时间*/ /*固定等待1750us,再减去IDLE中断等待的1个字符时间*/
/*1.5个字符=750us-1个字符时间*/ /*1.5个字符=750us-1个字符时间*/
#define MODBUS_IDLE_TO_T15_US \
((750UL * MODBUS_USART_BAUDRATE - 10000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
#define MODBUS_IDLE_TO_T15_US 750UL
/*2个字符=1000us*/ /*2个字符=1000us*/
#define MODBUS_T15_TO_T35_US 1000UL #define MODBUS_T15_TO_T35_US 1000UL
/*3.5个字符=1750us-1个字符时间*/ /*3.5个字符=1750us-1个字符时间*/
#define MODBUS_IDLE_TO_T35_US \
((1750UL * MODBUS_USART_BAUDRATE - 10000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
#define MODBUS_IDLE_TO_T35_US 1750UL
#else #else


/*IDLE中断已经过了1个字符的时间,还需等待2.5个字符*/ /*IDLE中断已经过了1个字符的时间,还需等待2.5个字符*/
/*1.5个字符-1个字符时间=0.5个字符时间*/
/*1.5个字符-1个字符时间=0.5个字符时间*/
#define MODBUS_IDLE_TO_T15_US \ #define MODBUS_IDLE_TO_T15_US \
((5000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
((15000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
/*2个字符时间*/ /*2个字符时间*/
#define MODBUS_T15_TO_T35_US \ #define MODBUS_T15_TO_T35_US \
((20000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE) ((20000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
/*3.5个字符-1个字符时间=2.5个字符时间*/ /*3.5个字符-1个字符时间=2.5个字符时间*/
#define MODBUS_IDLE_TO_T35_US \ #define MODBUS_IDLE_TO_T35_US \
((25000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
((35000000UL + MODBUS_USART_BAUDRATE - 1UL) / MODBUS_USART_BAUDRATE)
#endif #endif



extern uint8_t ModbusRxBuf[MODBUS_RX_BUF_SIZE]; extern uint8_t ModbusRxBuf[MODBUS_RX_BUF_SIZE];
extern uint8_t ModbusTxBuf[MODBUS_TX_BUF_SIZE]; extern uint8_t ModbusTxBuf[MODBUS_TX_BUF_SIZE];




+ 6
- 6
iar/settings/F407_uCOSii_Modbus.wsdt
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 1
- 1
iar/settings/uCOS_Modbus.dnx Visa fil

@@ -24,7 +24,7 @@
<stlinkResetStrategy>0</stlinkResetStrategy> <stlinkResetStrategy>0</stlinkResetStrategy>
</StLinkDriver> </StLinkDriver>
<DebugChecksum> <DebugChecksum>
<Checksum>3084689596</Checksum>
<Checksum>2649077694</Checksum>
</DebugChecksum> </DebugChecksum>
<Exceptions> <Exceptions>
<StopOnUncaught>_ 0</StopOnUncaught> <StopOnUncaught>_ 0</StopOnUncaught>


+ 943
- 944
iar/uCOS_Modbus.dep
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 1
- 1
modbus/modbus_parse.c Visa fil

@@ -42,7 +42,7 @@ void AppTaskModbusParse (void *p_arg)
rxLen = ModbusRxLen; rxLen = ModbusRxLen;
if(rxLen > MODBUS_RX_BUF_SIZE) if(rxLen > MODBUS_RX_BUF_SIZE)
{ {
rxLen = 0;
continue;
} }
memcpy(rxBuf, ModbusRxBuf, rxLen); memcpy(rxBuf, ModbusRxBuf, rxLen);




+ 6
- 0
modbus/modbus_rec_send.c Visa fil

@@ -32,6 +32,12 @@ void USART1_IRQHandler(void)
TimRestart(MODBUS_IDLE_TO_T15_US); TimRestart(MODBUS_IDLE_TO_T15_US);
break; break;


/*在t1.5定时还未到达时又接收到了数据*/
case MODBUS_RX_CHECK_T15:
ModbusRxState = MODBUS_RX_CHECK_T15;
TimRestart(MODBUS_IDLE_TO_T15_US);
break;

/*在判断t1.5~t3.5是否出现字符时,t3.5定时中断还未触发,又接收到了数据*/ /*在判断t1.5~t3.5是否出现字符时,t3.5定时中断还未触发,又接收到了数据*/
case MODBUS_RX_CHECK_T35: case MODBUS_RX_CHECK_T35:
ModbusRxState = MODBUS_RX_DISCARD_CHECK_T35; /*判断为错误帧*/ ModbusRxState = MODBUS_RX_DISCARD_CHECK_T35; /*判断为错误帧*/


Laddar…
Avbryt
Spara