📄 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 + -