📄 serial.c
字号:
#include "all.h"
//串口0 中断服务程序,仅需做简单调用即可完成串口输入输出的处理
//出入均设有缓冲区,大小可任意设置。
//*************************************************************************
#define BAUDRATE0 4800 // 用户定义的UART0 波特率
uchar *Poiter_GPRS_TX;
uchar xdata GPRS_RX_Buff[GPRS_RX_Buff_MAX];
uchar xdata GPRS_TX_Buff[GPRS_RX_Buff_MAX];
uint xdata GPRS_TX_cnt=0;
//uchar *Poiter_GPRS_TX=GPRS_RX_Buff;
uint xdata GPRS_TX_Len;
bit GPRS_TX_is_over_B=1; //所完标志位
// GPRS_TX_is_over_B=0表示串口忙被 占用,
//谁得到 GPRS_TX_is_over_B=1谁就得到串口生理权
xdata uchar GPRS_Xin_485_b_FLAG=0; //GPRS 标志寄存器
xdata uchar GPRS_Es_jie_cnt; //时限计时值
xdata uchar GPRS_Es_jie_cnt; //时限计时值
xdata uint Gprs_i_485;
xdata uchar Tem_sbuf;
uchar DABAO_EEEE_GPRA_buffer(uchar qian1,uchar qian2,uchar Fun,uchar *Poit,uint Lenthg,uchar *Re_Poit) reentrant ;
//void Get_Fa_Gprs_buffer_Right( );
void Open_URRA_0(void)
{
PCON |= 0x80; // SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
TMOD = 0x20; // Configure Timer 1 for use by UART0
CKCON |= 0x10; // Timer 1 derived from SYSCLK
RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
TH2=RCAP2H;TL2=RCAP2L;
CT2=0; //T2:timer mode
TR2=1;
TCLK0=1;
RCLK0=1; //说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
// SIO1只能用T1作为波特率发生器
//baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
RI0=0; // Clear HW_UART receive and transmit
TI0=0; // complete indicators.
SCON0 = 0x50; // Configure UART0 for mode 1, receiver enabled.
ES0=1; // allow the serial interrupt
}
/**********************************************************************
**函数原型: void DiJi_ZhengJuan()
**入口参数:
**出口参数: 无
**返 回 值: 无
**说 明: uart0 中断 用于GPRS
************************************************************************/
void URRA_0_ISR(void) interrupt 4 using 3 {
if (_testbit_(RI0))
{
RI0=0;
//if(GPRS_Xin_485_b_FLAG==0) { //数据未处理就是来新数据也不能接收
if(Gprs_i_485>=GPRS_RX_Buff_MAX) //防止超出数组范围
Gprs_i_485=0;
GPRS_Es_jie_cnt=20; //时限计时值 100ms
GPRS_RX_Buff[Gprs_i_485++]=SBUF0;
//}
}
if (_testbit_(TI0))
{
TI0=0; //发送中断 发送入口,TX_Len:所发送的字节数
// TX_Buff[]: 发送缓冲区
if(GPRS_TX_Len>=GPRS_RX_Buff_MAX)
GPRS_TX_Len=GPRS_RX_Buff_MAX;
if(GPRS_TX_Len!=0) {
// GPRS_TX_is_over_B=0;
Tem_sbuf=GPRS_TX_Buff[1+GPRS_TX_cnt++];
SBUF0=Tem_sbuf;
}
else {
GPRS_TX_cnt=0;
// GPRS_TX_is_over_B=1; //所完标志位
}
GPRS_TX_Len--;
}
}
//==========================================================
//================以上是串口中断,用于接收GPRS
//等待得到控制权
//等待得到控制权
//只有得到权限才能更新缓冲区数据
/*
void Get_Fa_Gprs_buffer_Right( )
{ xdata uchar ttt=0;
while(GPRS_TX_is_over_B==0) { //TX所完标志位,没发完再发时要等待
os_wait2(K_TMO, 50); //100ms
if(ttt++>100) //延时5秒 到也认为发送有空
break;
}
GPRS_TX_is_over_B=0; //抢到标志,处暑、延时100MS再发, 串间隔
os_wait2(K_TMO, 50); //100ms
}
//==============================w2812837@163.com=================================================
*/
/**********************************************************************
**函数原型: void Fa_Gprs_buffer(uint Lenthg)
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 将GPRS_TX_Buff[]发送子程序。
// 发送入口,TX_Len:所发送的字节数
// GPRS_TX_Buff[]: 发送缓冲区
// TxIe=1;
// GPRS_TX_cnt=0; 100MS 串间隔
************************************************************************/
/*
void Fa_Gprs_buffer(uint Lenthg)
{
// En_FA_485;
GPRS_TX_Len=Lenthg-1; //TX_LEN发送前置好数值
GPRS_TX_cnt=0;
SBUF0=GPRS_TX_Buff[0];
}
//==============================w2812837@163.com=================================================
*/
/**********************************************************************
**函数原型: void Fa_Gprs_buffer(uint Lenthg)
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 先取得控制权,然后
、、将指针指向的数组发给GPRS_TX_Buff[] 发送子程序。
// 发送入口,TX_Len:所发送的字节数
// GPRS_TX_Buff[]: 发送缓冲区
// TxIe=1;
// GPRS_TX_cnt=0; 100MS 串间隔
************************************************************************/
/*
void Fa_Gprs_Other2buffer(char *Poiter,uint Lenthg)
{
uchar i;
Get_Fa_Gprs_buffer_Right( );
Clr_GPRS_RX_Buff();
GPRS_Xin_485_b_FLAG=GPRS_Xin_485_b_FLAG&(~XIN_GSM_R_B); //clr bit
for(i=0;i<Lenthg;i++)
GPRS_TX_Buff[i]=*Poiter++;
// En_FA_485;
GPRS_TX_Len=Lenthg-1; //TX_LEN发送前置好数值
GPRS_TX_cnt=0;
SBUF0=GPRS_TX_Buff[0];
}
//==============================w2812837@163.com=================================================
*/
//清接收区为0
void Clr_GPRS_RX_Buff() reentrant {
uint i;
for (i=0;i<GPRS_RX_Buff_MAX;i++)
GPRS_RX_Buff[i]=0;
}
/**********************************************************************
**函数原型: void DABAO_EEEE_GPRA_buffer(uchar qian1,uchar qian2,uchar Fun,uchar *Poit,uint Lenthg)
**入口参数: ttt X 2ms = 时限 char *pppp 为要找的字符串
**出口参数: 无
**返 回 值: 整个包的长度
**说 明: 发GPRS数据
************************************************************************/
uchar DABAO_EEEE_GPRA_buffer(uchar qian1,uchar qian2,uchar Fun,uchar *Poit,uint Lenthg,uchar *Re_Poit) reentrant
{
uchar i,j;
Gprs_i_485=0; //接收数组下标复位;
Re_Poit[0]=qian1;
Re_Poit[1]=qian2;
Re_Poit[2]=Fun ;
Re_Poit[3]=Lenthg;
for(i=0;i<Lenthg;i++) {
Re_Poit[4+i]=*Poit++;
}
Re_Poit[4+i]=0;
j=0;
for(j=0;j<(Lenthg+2);j++)
Re_Poit[4+i]+= Re_Poit[j+2];
Re_Poit[4+i+1]=0xab;
Re_Poit[4+i+2]=0x1A; // ctr+z
Re_Poit[4+i+3]=0; // '0'
//GPRS_TX_Len=Lenthg+6+1; //TX_LEN发送前置好数值
return(Lenthg+6+1);
//Fa_F76_buffer(uchar Fun, uchar * Poit, uint Lenthg)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -