C編程規范, 示例代碼。
/***************************************************************
*Copyright (c) 2014,TianYuan
*All rights reserved.
*
*文件名稱: standard.h
*文件標識: 編程規范示例代碼
*
*當前版本:V1.0
*作者:wuyq
*完成日期:20140709
*
*修改記錄1: //修改歷史記錄,包括修改日期、版本號、修改人及修改內容等
*修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------------------------------------------
* 20140709 V1.0 wuyq 創建
******************************************************************/
#ifndef _STANDARD_H__
#define _STANDARD_H__
/*重定義一些基本數據類型*/
typedef char s8;
typedef unsigned char u8;
typedef signed short s16;
typedef unsigned short u16;
typedef int s32;
typedef unsigned int u32;
typedef float f32;
typedef signed long long s64;
typedef unsigned long long u64;
typedef enum {FALSE =0, TRUE =!FALSE} bool;
typedef bool BOOL;
/* 消息頭 */
typedef struct {
u16 u16MsgType; /* 消息類型*/
u16 u16MsgLength; /*有效消息數據長度*/
u8 u8TransType; /*傳輸通道0:網絡 1:串口*/
u8 u8Reserved[3]; /*對齊*/
}STRU_MSG_HEAD;
/* 時間信息*/
typedef struct {
u16 u16Year; /*年*/
u16 u16Month; /*月*/
u8 u8Day; /*日*/
u8 u8Hour; /*時*/
u8 u8Minute; /*分*/
u8 u8Second; /*秒*/
}STRU_TIME_INFO;
/* MCM->Main 查詢系統信息*/
struct stru_machine_info_req {
STRU_MSG_HEAD struMsgHeader;/*消息頭*/
};
/* Main->MCM 反饋系統信息*/
struct stru_machine_info_rsp {
STRU_MSG_HEAD struMsgHeader;/*消息頭*/
f32 f32Temp;/*當前采樣溫度*/
f32 f32Vol;/*當前采樣電壓*/
f32 f32CpuFreq;/*Cpu頻率*/
u32 u32FreeMem;/*剩余內存*/
u32 u32FreeDisk;/*剩余FLASH空間*/
};
/* Main向MCM返回軟件升級結果 */
struct stru_software_update_rsp {
STRU_MSG_HEAD struMsgHeader;
u8 b8Successful;/*是否升級成功*/
u8 u8Reserved[3];/*字對齊,保留*/
};
//函數頭部的可采用如下的樣式
/**********************************************************************
*功能描述:
*輸入參數:
*輸出參數:
*返回值:
*其它說明:
*修改記錄1: //修改歷史記錄,包括修改日期、版本號、修改人及修改內容等
*修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------------------------------------------
* 20140709 V1.0 wuyq 創建
***********************************************************************/
#endif
/**********************************************************************
*Copyright (c) 2014,TianYuan
*All rights reserved.
*
* 文件名稱: UnitTest.c
* 文件標識:無
* 內容摘要:協議及單元測試示例代碼
* 其它說明:無
* 當前版本: V1.0
* 作 者: wuyq
* 完成日期: 20140709
*
*修改記錄1: //修改歷史記錄,包括修改日期、版本號、修改人及修改內容等
*修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------------------------------------------
* 20140709 V1.0 wuyq 創建
**********************************************************************/
#include
#include
// 重定義數據類型
typedef unsigned char UINT8;
typedef unsigned short int UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
// 消息頭結構
typedef struct
{
UINT16 iReserve1;
UINT16 iReserve2;
UINT16 iReserve3;
UINT16 iReserve4;
}MsgHead_T;
// 消息結構體(包含消息頭和消息體)
typedef struct
{
MsgHead_T MsgHead; // 消息頭
UINT32 iOperType; // 操作類型, 操作類型只能為1或2
UINT8 szUserNumber[30]; // 用戶號碼
UINT8 szOperTime[20]; // 操作時間, 格式為: yyyymmdd
UINT32 iReserve1; // 保留字段1
UINT8 szReserve2[50]; // 保留字段2
}UserReqMsg_T;
// 函數聲明
INT32 ProcUserReqMsg(UserReqMsg_T *ptUserReqMsg);
INT32 main();
/**********************************************************************
* 功能描述:主函數
* 輸入參數:無
* 輸出參數:無
* 返回值: 0-執行完畢
* 其它說明:無
* 修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------------------------------------------
* 20140507 V1.0 zzx 創建
***********************************************************************/
INT32 main()
{
UINT8 iRetVal = 0;
UINT32 iOperType = 0; // 操作類型
UINT8 szUserNumber[30] = {0}; // 用戶號碼
UINT8 szOperTime[10] = {0}; // 操作時間, 格式為: yyyymmdd
UserReqMsg_T tUserReqMsg = {0}; // 請求消息
// 對消息頭部進行賦值
tUserReqMsg.MsgHead.iReserve1 = 1;
tUserReqMsg.MsgHead.iReserve2 = 2;
tUserReqMsg.MsgHead.iReserve3 = 3;
tUserReqMsg.MsgHead.iReserve4 = 4;
// 讀入具體消息字段的值
printf("操作類型: \n");
scanf("%d", &iOperType);
printf("用戶號碼: \n");
scanf("%s", szUserNumber);
printf("操作時間: \n");
scanf("%s", szOperTime);
// 對具體消息字段進行賦值(保留字段可不賦值)
tUserReqMsg.iOperType = iOperType;
strncpy(tUserReqMsg.szUserNumber, szUserNumber, strlen(szUserNumber));// 獲取號碼, 用strncpy代替strcpy
strncpy(tUserReqMsg.szOperTime, szOperTime, strlen(szOperTime)); // 獲取時間, 用strncpy代替strcpy
// 對消息體的字段進行異常判斷
iRetVal = ProcUserReqMsg(&tUserReqMsg); // 注意: 傳遞參數的時候要加上&
if (iRetVal == 0) // 函數執行正確
{
// 打印消息字段內容
printf("The user request message is: iOperType=%d, szUserNumber=%s, szOperTime=%s.\n", tUserReqMsg.iOperType, tUserReqMsg.szUserNumber, tUserReqMsg.szOperTime);
return 0;
}
else // 打印異常消息
{
printf("Some content of the user request message is wrong, please check!\n");
return -1;
}
}
/**********************************************************************
* 功能描述:對消息體的字段進行異常判斷
* 輸入參數: ptUserReqMsg-用戶請求消息
* 輸出參數:無
* 返回值: 0-成功 其它-失敗
* 其它說明:無
* 修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------------------------------------------
* 20140507 V1.0 zzx 創建
***********************************************************************/
INT32 ProcUserReqMsg(UserReqMsg_T *ptUserReqMsg)
{
INT32 iRetValue = 0;
// 對輸入參數進行異常判斷
if (ptUserReqMsg == NULL)
{
printf("ProcUserReqMsg(...): input parameter(ptUserReqMsg) is NULL.\n");
return -1;
}
// 對消息體字段進行異常判斷
if ((ptUserReqMsg->iOperType != 1) && (ptUserReqMsg->iOperType != 2)) // 操作類型只能為1或2, 其它為數據異常
{
printf("ProcUserReqMsg(...): the iOperType is wrong, iOperType=%d.\n", ptUserReqMsg->iOperType);
return -2;
}
if (strlen(ptUserReqMsg->szUserNumber) != 8) // 用戶號碼異常, 長度8位才正確
{
printf("ProcUserReqMsg(...): the szUserNumber is wrong.\n");
return -3;
}
if (strlen(ptUserReqMsg->szOperTime) != 8) // 操作時間異常, 長度8位才正確
{
printf("ProcUserReqMsg(...): the szOperTime is wrong.\n");
return -4;
}
return 0;
}