?? commup.c
字號:
/****************************************Copyright (c)**************************************************
** 江蘇廣一科技有限公司
** 研 發 部
** 浙江配變
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: commup.c
**創 建 人:
**最后修改日期: 2008年08月30日
**描 述:
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define COMMUP_GLOBALS
#include "commup.h"
#include "powerram.h"
#include "global.h"
#include "main.h"
//extern OS_EVENT * Gprs_Set_Ack;
//extern uint8 GprsCommBuf[256]; // 終端與GPRS模塊間通訊緩沖區
//extern uint8 GprsInitFlag;
//extern RCV_BUF Rs232_Buf; // 本地通訊接口緩沖區
//extern RCV_BUF Rs232_Buf; // 本地通訊接口緩沖區
//extern RCV_QUE Rcv_Q[16]; // 接收隊列
/*typedef struct { // 接收隊列數據結構
uint8 state; // 0:為空 1:有數據待處理
uint8 *read;
uint8 *write;
uint8 chtype; // 01:短信 02:GPRS 05:紅外 06:RS232
uint8 addr[6]; // 主站通訊地址
uint8 concode; // 控制碼
uint8 datalen[2]; // 數據長度
uint16 bufsize; // 緩沖區尺寸
uint8 buf[1024]; // 數據區
//uint8 chkcode[2]; // 校驗碼
} RCV_QUE; */ // 說明:在POWERRAM.C中定義一個16的結構數組
/*uint8 *read; // 接收緩沖區的讀指針
uint8 *write; // 接收緩沖區的寫指針
uint32 len; // 接收緩沖區的數據長度
uint32 size; // 接收緩沖區的尺寸
uint8 buf[2048];*/
/*********************************************************************************************************
** 函數名稱: InitRcvBuf()
** 功能描述: 初始化接收緩沖區函數
**
** 輸 入: 無
**
** 輸 出: 無
**
** 全局變量: Rs232_Buf: 接收緩沖區
** Rcv_Q: 接收隊列
** Send_Q: 發送隊列
** 調用模塊:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitRcvBuf(void)
{
uint8 i;
if ((Rs232_Buf.InitFlag[0] != 0x0B) &&
(Rs232_Buf.InitFlag[1] != 0xAA))
{
for (i=0;i<16;i++)
{
Rcv_Q[i].state = 0; // 將接收隊列狀態初始化為空
//Rcv_Q[i].bufsize = 1024;
//Rcv_Q[i].read = Rcv_Q[i].buf;
//Rcv_Q[i].write = Rcv_Q[i].buf;
}
for (i=0;i<64;i++)
{
Send_Q[i].state = 0; // 將發送隊列狀態初始化為空
}
for (i=0;i<60;i++)
{
ProgramLog[i].mp_num = 0xFF;
}
p_ProgramLog = 0;
Rs232_Buf.InitFlag[0] = 0x0B;
Rs232_Buf.InitFlag[1] = 0xAA;
}
else
{
;
}
Rs232_Buf.read = Rs232_Buf.buf; // 將指針指向接收緩沖區首地址(RS232)
Rs232_Buf.write = Rs232_Buf.buf;
Rs232_Buf.size = RCV_BUF_SIZE;
Rs232_Buf.len = 0;
Gprs_Buf.read = Gprs_Buf.buf; // 將指針指向接收緩沖區首地址(GPRS)
Gprs_Buf.write = Gprs_Buf.buf;
Gprs_Buf.size = RCV_BUF_SIZE;
Gprs_Buf.len = 0;
}
/*********************************************************************************************************
** 函數名稱: ReadBuf
** 功能描述: 讀底層緩沖區函數
**
** 輸 入: port:端口號
**
** 輸 出: 讀出的字節數
**
** 全局變量: 無
** 調用模塊: ReadCommMs()
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 ReadBuf(uint8 port)
{
uint8 uc_rxbuf[128];
uint32 len,len1;
uint32 i;
len = 0;
switch (port)
{
case COMM1:
while(CommOverTimes<5)
{
len1 = ReadCommMs(COMM1,uc_rxbuf,128,40, 100);
if (len1!=0)
{
len = len + len1;
for (i=0;i<len1;i++) // 將讀到的數據放到本地接收緩沖區
{
*Rs232_Buf.write = uc_rxbuf[i];
Rs232_Buf.len ++;
Rs232_Buf.write ++;
if (Rs232_Buf.write>(Rs232_Buf.buf + Rs232_Buf.size))
{
Rs232_Buf.write = Rs232_Buf.buf;
}
}
waitms(20);
}
else
{
break;
}
}
return(len);
break;
case COMM2:
while (CommOverTimes<5)
{ if (GprsInitFlag==1) // GPRS在初始化,此處不接收
return(0);
len1 = ReadCommMs(COMM2,uc_rxbuf,128,40, 100); // 讀底層接收緩沖區
if (len1!=0) // 將讀到的數據放到本地接收緩沖區
{
len = len + len1;
for (i=0;i<len1;i++) // 將讀到的數據放到本地接收緩沖區
{
*Gprs_Buf.write = uc_rxbuf[i];
Gprs_Buf.len ++;
Gprs_Buf.write ++;
if (Gprs_Buf.write>(Gprs_Buf.buf + Gprs_Buf.size))
{
Gprs_Buf.write = Gprs_Buf.buf;
}
}
waitms(20);
}
else
{
break;
}
}
return(len);
break;
default:
return(0);
break;
}
}
/*********************************************************************************************************
** 函數名稱: ReadRcvBuf
** 功能描述: 讀接收緩沖區函數
**
** 輸 入: port
**
** 輸 出: data
**
** 全局變量:
** 調用模塊:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadRcvBuf(uint8 port)
{
uint8 data;
switch (port)
{
case COMM1:
if (Rs232_Buf.len != 0)
{
data = *Rs232_Buf.read;
Rs232_Buf.read ++;
Rs232_Buf.len --;
}
if (Rs232_Buf.read>(Rs232_Buf.buf+Rs232_Buf.size))
{
Rs232_Buf.read = Rs232_Buf.buf;
}
return(data);
break;
case COMM2:
if (Gprs_Buf.len != 0)
{
data = *Gprs_Buf.read;
Gprs_Buf.read ++;
Gprs_Buf.len --;
}
if (Gprs_Buf.read>(Gprs_Buf.buf+Gprs_Buf.size))
{
Gprs_Buf.read = Gprs_Buf.buf;
}
/*if (Rs232_Buf.len != 0)
{
data = *Rs232_Buf.read;
Rs232_Buf.read ++;
Rs232_Buf.len --;
}*/
return(data);
break;
default:
return(NULL);
break;
}
}
/*********************************************************************************************************
** 函數名稱: PushRcvToQue
** 功能描述: 將接收到的完整幀寫入接收隊列
**
** 輸 入: ch: 通道類型
** *buf:接收緩沖區地址
**
** 輸 出: 0:成功 1:失敗 2:隊列已滿
**
** 全局變量:
** 調用模塊:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PushRcvToQue(uint8 ch, uint8 *buf)
{
uint8 i;
uint8 *point;
//uint8 *qpoint;
uint16 len;
static uint8 que_num;
for (i=0;i<16;i++) // 找出空閑的接收隊列
{
if (que_num==16)
{
return(2); // 接收隊列已滿
}
if (Rcv_Q[i].state == 0)
{
que_num = i;
break;
}
else continue;
}
point = buf;
Rcv_Q[que_num].chtype = ch;
point ++;
for (i=0;i<6;i++) // 保存地址
{
Rcv_Q[que_num].addr[i] = *point;
point ++;
}
point ++;
Rcv_Q[que_num].concode = *point; // 保存控制碼
point ++;
Rcv_Q[que_num].datalen[0] = *point; // 保存數據長度
point ++;
Rcv_Q[que_num].datalen[1] = *point;
point ++;
len = Rcv_Q[que_num].datalen[1];
len = (len << 8)+ Rcv_Q[que_num].datalen[0];
if (len>1024)
{
Rcv_Q[i].state = 0;
return(1);
}
for (i=0;i<len;i++) // 保存數據
{
Rcv_Q[que_num].buf[i] = *point;
point ++;
}
Rcv_Q[que_num].state = 1;
return(0);
}
/*********************************************************************************************************
** 函數名稱: WriteRcvQue
** 功能描述: 將兩個接收緩沖區的數據寫入接收隊列
**
** 輸 入: 無
**
** 輸 出: 0:成功將數據寫入接收隊列 1:未有數據寫入
**
** 全局變量:
** 調用模塊:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WriteRcvQue(void)
{
if (WriteRcvQue0() == 0)
return(0);
if (WriteRcvQue1() == 0)
return(0);
else
return(1);
}
/*********************************************************************************************************
** 函數名稱: WriteRcvQue0
** 功能描述: 從RS232接收緩沖區找出一個完整幀并寫入接收隊列
**
** 輸 入: 無
**
** 輸 出: 0:成功將數據寫入接收隊列 1:未有數據寫入
**
** 全局變量:
** 調用模塊: PushRcvToQue
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WriteRcvQue0(void)
{
static uint8 uc_rs232mbuf[1400];
static uint16 u_tlen;
static uint16 u_len;
uint32 i;
uint8 uc_data;
uint8 uc_chkcode;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -