?? mbcommon.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州致遠電子有限公司
**
** http://www.21cm.com.cn
**
**
**--------------File Info-------------------------------------------------------------------------------
** File name: MBCommon.c
** Last modified Date: 2005-01-11
** Last Version: 1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Created by: ZhouLishan
** Created date: 2005-01-11
** Version: 1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
PDU_HANDLE PDUData;
volatile ADU_CONTROL ADUData;
#ifdef UCOSII
extern OS_EVENT *mb_handle_event_ptr;
#endif
extern uint16 Modbus_CRC16(uint8 *Buff_addr,uint16 len);
//********************************************************************************************************
// 函數名稱:StartCountT15
// 輸入參數:無
// 輸出參數:無
// 功能描述:使能T1.5計數。T1.5的時間值為UART傳輸1.5個字符的時間。
// 注意:該函數只是使能計時,不允許在函數中產生任何延時。
// 如果T1.5時間結束執行T15EndHandle函數。
//********************************************************************************************************
extern void StartCountT15(void);
//********************************************************************************************************
// 函數名稱:StartCountT35
// 輸入參數:無
// 輸出參數:無
// 功能描述:使能T3.5計數。T3.5的時間值為UART傳輸3.5個字符的時間。
// 注意:該函數只是使能計時,不允許在函數中產生任何延時。
// 如果T3.5時間結束執行T35EndHandle函數。
//********************************************************************************************************
extern void StartCountT35(void);
volatile uint32 g_10mS_count;
volatile uint8 g_TimeEnd; // 應答超時
//******************************************************************************************
// 函數名稱:Get_10mS
// 輸入參數:無
// 輸出參數:10mS計數寄存器
// 功能描述:獲取10mS計數值,該值每10毫秒加1
//******************************************************************************************
void Waite10mS(uint32 time)
{
g_TimeEnd = FALSE;
g_10mS_count=time;
}
//*****************************************************************************
// 函數名稱:OverTimeHandle
// 輸入參數:無
// 輸出參數:無
// 功能描述:
//*****************************************************************************
void Time10mSHandle(void)
{
if(g_10mS_count==0) return; // g_10mS_count,值為0表示沒有計數事件,直接返回
g_10mS_count--; // 計數減1,直接到0為直
if(g_10mS_count==0)
{ g_TimeEnd = TRUE;
#ifdef UCOSII
OSSemPost(mb_handle_event_ptr); // 發報信號量,使MODBUS服務任務處理傳輸
#endif
}
}
//********************************************************************************************************
// 函數名稱:T15EndHandle
// 輸入參數:無
// 輸出參數:無
// 功能描述:T1.5超時處理
//********************************************************************************************************
void T15EndHandle(void)
{
uint16 RedundancyCheck;
if(ADUData.EndT15)
return;
ADUData.EndT15 = TRUE; // T1.5時間結束
if((*ADUData.ADUBuffPtr==BROADCAST_ADDRESS)|| // 驗證地址是否有效
(*ADUData.ADUBuffPtr==ADUData.Address))
{
RedundancyCheck = *(ADUData.ADUBuffPtr+ADUData.ADULength-2)|
(*(ADUData.ADUBuffPtr+ADUData.ADULength-1)<<8);
if(RedundancyCheck == Modbus_CRC16(ADUData.ADUBuffPtr,ADUData.ADULength-2)) // CRC校驗
{
ADUData.FrameOK = TRUE;
return;
}
}
ADUData.FrameOK = FALSE;
}
//********************************************************************************************************
// 函數名稱:T35EndHandle
// 輸入參數:無
// 輸出參數:無
// 功能描述:T3.5結束處理
//********************************************************************************************************
void T35EndHandle(void)
{
if(ADUData.FrameOK)
{
PDUData.PDUBuffPtr = ADUData.ADUBuffPtr+1;
PDUData.PDULength = ADUData.ADULength-3;
PDUData.FunctionCode = *PDUData.PDUBuffPtr; // 保存功能代碼
PDUData.FrameOK=TRUE;
}
else
{
PDUData.FrameOK=FALSE;
}
ADUData.EndT15 = FALSE; // 允許收到字符
ADUData.ADULength = 0;
#ifdef UCOSII
OSSemPost(mb_handle_event_ptr); // 發報信號量,使MODBUS服務任務處理傳輸
#endif
}
//********************************************************************************************************
// 函數名稱:ReceOneChar
// 輸入參數:ReceCharacter
// 輸出參數:無
// 功能描述:接收一個字符處理
// 要求:接收到一個字符后立即傳入該函數處理。
//********************************************************************************************************
void ReceOneChar(uint8 ReceCharacter)
{
if(ADUData.EndT15==TRUE)
{ StartCountT35(); // 起動T3.5計時
return;
}
ADUData.FrameOK = FALSE;
StartCountT15(); // 起動T1.5計時
StartCountT35(); // 起動T3.5計時
*(ADUData.ADUBuffPtr + ADUData.ADULength) = ReceCharacter;
ADUData.ADULength++;
}
//********************************************************************************************************
// 函數名稱:PutCharInPUD
// 輸入參數:ch,寫入的字符
// EndChar,
// 輸出參數:無
// 功能描述:接收一個字符處理
// 要求:接收到一個字符后立即傳入該函數處理。
//********************************************************************************************************
uint8 PutDataInPUD(uint8 *CharPtr,uint16 Length)
{
uint16 i;
if(Length<=MAX_PDU_DATA_LENGTH)
{
for(i=0;i<Length;i++)
*(PDUData.PDUBuffPtr+i)=*(CharPtr+i);
PDUData.PDULength = Length ;
PDUData.FrameOK = TRUE;
return TRUE;
}
else
return FALSE;
}
/*********************************************************************************************************
** OSModbusServe MODBUS服務任務
********************************************************************************************************/
#ifdef UCOSII
void OSModbusServe (void *pdata)
{ pdata = pdata;
while (1)
{ IdleModbus();
}
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -