📄 commup.c
字号:
uint32 ul_mm;
uint8 ch;
if (Rs232_Buf.len != 0) // 完整帧的处理
{
ul_mm = Rs232_Buf.len;
for (i=0;i<ul_mm;i++)
{
uc_data = ReadRcvBuf(COMM1);
if (uc_data == 0x68) // 查询第一个0x68
{
uc_rs232mbuf[0] = 0x68;
u_len = 0;
u_tlen = 1;
break;
}
else
{
continue;
}
}
}
else return(1);
if (i==ul_mm)
{
u_len = 0;
u_tlen = 1;
return(1); // 未收到第一个0x68直接返回
}
/*while (Rs232_Buf.len < 10) // 接收0x68后的10字节,不满10字节,要接收满10字节
{
ReadBuf(COMM1); // 直接读底层
}*/
for (i=0;i<6;i++)
{
uc_rs232mbuf[u_tlen] = ReadRcvBuf(COMM1); // 接收6字节地址
u_tlen ++;
}
uc_data = ReadRcvBuf(COMM1); // 判断第二个0x68
if(uc_data != 0x68)
{
u_len = 0;
u_tlen = 1; // 如果第二个0x68不正确,抛掉
return(1);
}
else
{
uc_rs232mbuf[u_tlen] = uc_data;
u_tlen ++;
}
for(i=0;i<3;i++)
{
uc_rs232mbuf[u_tlen] = ReadRcvBuf(COMM1); // 接收控制码和数据长度
u_tlen ++;
}
u_len = uc_rs232mbuf[u_tlen - 1]; // 计算整个DATA域的长度
u_len = (u_len << 8);
u_len = u_len + uc_rs232mbuf[u_tlen - 2];
if(u_len>1024) // 如果DATA域过长,抛掉
{
u_tlen = 0;
u_len = 0;
return(1);
}
/*while (Rs232_Buf.len < (u_len + 2)) // 接收剩余的全部数据
{
ReadBuf(COMM1); // 直接读底层
}*/
while (u_len>0)
{
uc_rs232mbuf[u_tlen] = ReadRcvBuf(COMM1); // 接收DATA域
u_tlen ++;
u_len --;
}
uc_chkcode = ReadRcvBuf(COMM1); // 接收校验码
uc_rs232mbuf[u_tlen] = uc_chkcode;
u_tlen ++;
uc_data = ReadRcvBuf(COMM1); // 接收0x16
if (uc_data == 0x16)
{
uc_rs232mbuf[u_tlen] = uc_data;
}
else
{
u_tlen = 0; // 帧尾不正确,抛掉
u_len = 0;
return(1);
}
uc_chkcode = AddData(uc_rs232mbuf, u_tlen-1); // 校验
if (uc_chkcode != uc_rs232mbuf[u_tlen - 1])
{
u_tlen = 0;
u_len = 0;
return(1);
}
u_tlen = 0;
u_len = 0;
/*if (ReadCpuIoStatus(IO_SEL_SMS)) // 判断通道
{
ch = 0x05; // 红外通讯
}
else
{
ch = 0x06; // 232状态
}*/
ch = 0x06;
if (PushRcvToQue(6,uc_rs232mbuf) != 0) // 将缓冲区数据写入接收队列
{
return(1);
}
return(0); // 接收成功返回0
}
/*********************************************************************************************************
** 函数名称: WriteRcvQue1
** 功能描述: 从GPRS接收缓冲区找出一个完整幀并写入接收队列
**
** 输 入: 无
**
** 输 出: 0:成功将数据写入接收队列 1:未有数据写入
**
** 全局变量:
** 调用模块: PushRcvToQue
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WriteRcvQue1(void)
{
static uint8 uc_gprsmbuf[1400];
static uint16 u_tleng;
static uint16 u_leng;
uint32 i;
uint8 ch;
uint8 uc_data;
uint8 uc_chkcode;
uint32 ul_mm;
//uint8 len;
if (Gprs_Buf.len != 0) // 完整帧的处理
{
ul_mm = Gprs_Buf.len;
for (i=0;i<ul_mm;i++)
{
uc_data = ReadRcvBuf(COMM2);
if (uc_data == 0x68) // 查询第一个0x68
{
uc_gprsmbuf[0] = 0x68;
u_leng = 0;
u_tleng = 1;
break;
}
else
{
continue;
}
}
}
else return(1);
if (i==ul_mm)
{
u_leng = 0;
u_tleng = 1;
return(1); // 未收到第一个0x68直接返回
}
/*while (Gprs_Buf.len < 10) // 接收0x68后的10字节,不满10字节,要接收满10字节
{
ReadBuf(COMM2); // 直接读底层
}*/
for (i=0;i<6;i++)
{
uc_gprsmbuf[u_tleng] = ReadRcvBuf(COMM2); // 接收6字节地址
u_tleng ++;
}
uc_data = ReadRcvBuf(COMM2); // 判断第二个0x68
if(uc_data != 0x68)
{
u_leng = 0;
u_tleng = 1; // 如果第二个0x68不正确,抛掉
return(1);
}
else
{
uc_gprsmbuf[u_tleng] = uc_data;
u_tleng ++;
}
/*if ((uc_gprsmbuf[1]==0x0E) && (uc_gprsmbuf[2]==0x00) && // 判断是否是GPRS本地通讯
(uc_gprsmbuf[3]==0x00) && (uc_gprsmbuf[4]==0x00) &&
(uc_gprsmbuf[5]==0x00) && (uc_gprsmbuf[6]==0x00) )
{
for (i=0;i<8;i++)
{
GprsCommBuf[i] = uc_gprsmbuf[i];
}
GprsCommBuf[8] = ReadRcvBuf(COMM2); // 接收控制码
GprsCommBuf[9] = ReadRcvBuf(COMM2); // 接收数据长度
len = GprsCommBuf[9];
for (i=0;i<len;i++)
{
GprsCommBuf[10+i] = ReadRcvBuf(COMM2); // 接收其他数据
}
GprsCommBuf[10+len] = ReadRcvBuf(COMM2);
uc_chkcode = AddData(GprsCommBuf, len+10);
if (uc_chkcode==GprsCommBuf[10+len])
{
GprsCommBuf[10+len+1] = ReadRcvBuf(COMM2);
OSSemPost(Gprs_Set_Ack);
}
u_tleng = 0;
u_leng = 0;
return(0);
}
*/
for(i=0;i<3;i++)
{
uc_gprsmbuf[u_tleng] = ReadRcvBuf(COMM2); // 接收控制码和数据长度
u_tleng ++;
}
u_leng = uc_gprsmbuf[u_tleng - 1]; // 计算整个DATA域的长度
u_leng = (u_leng << 8);
u_leng = u_leng + uc_gprsmbuf[u_tleng - 2];
if(u_leng>1024) // 如果DATA域过长,抛掉
{
u_tleng = 0;
u_leng = 0;
return(1);
}
/*while (Gprs_Buf.len < (u_leng + 2)) // 接收剩余的全部数据
{
ReadBuf(COMM2); // 直接读底层
}*/
while (u_leng>0)
{
uc_gprsmbuf[u_tleng] = ReadRcvBuf(COMM2); // 接收DATA域
u_tleng ++;
u_leng --;
}
uc_chkcode = ReadRcvBuf(COMM2); // 接收校验码
uc_gprsmbuf[u_tleng] = uc_chkcode;
u_tleng ++;
uc_data = ReadRcvBuf(COMM2); // 接收0x16
if (uc_data == 0x16)
{
uc_gprsmbuf[u_tleng] = uc_data;
}
else
{
u_tleng = 0; // 帧尾不正确,抛掉
u_leng = 0;
return(1);
}
uc_chkcode = AddData(uc_gprsmbuf, u_tleng-1); // 校验
if (uc_chkcode != uc_gprsmbuf[u_tleng - 1])
{
u_tleng = 0;
u_leng = 0;
return(1);
}
u_tleng = 0;
u_leng = 0;
if (ReadCpuIoStatus(IO_SEL_SMS)) // 判断通道
{
ch = 0x02; // GPRS通讯
}
else
{
ch = 0x01; // 短信状态
}
if (PushRcvToQue(ch,uc_gprsmbuf) != 0) // 将缓冲区数据写入接收队列
{
return(1);
}
return(0); // 接收成功返回0
}
/*********************************************************************************************************
** 函数名称: AddData()
** 功能描述: 校验和累加函数
**
** 输 入:
**
** 输 出: 校验码
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 AddData(uint8 *buf, uint16 len)
{
uint16 u_addata;
uint8 *pt;
uint16 i;
uint8 uc_data;
u_addata = 0;
pt = buf;
for (i=0;i<len;i++)
{
u_addata = (u_addata & 0x00FF) + *pt;
pt ++;
}
uc_data = (uint8)u_addata;
return(uc_data);
}
/*********************************************************************************************************
** 函数名称: PushSendQue()
** 功能描述: 写发送队列函数
**
** 输 入: *buf 发送缓冲区地址
** len 发送数据长度
** ch 发送通道
** 输 出: 0:成功 1:失败
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PushSendQue(uint8 *buf,uint32 len, uint8 ch)
{
uint8 i;
uint32 j;
for (i=0;i<64;i++)
{
if (i==64)
return(1);
if (Send_Q[i].state==0)
{
Send_Q[i].state = 1;
Send_Q[i].count = 0;
Send_Q[i].ch = ch;
Send_Q[i].len = len;
for (j=0;j<len;j++)
{
Send_Q[i].buf[j] = buf[j];
//Send_Q[i].len ++;
}
break;
}
else continue;
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -