📄 serial1.c
字号:
//*************************************************************************
#include "all.h"
void Open_URRA_1(void);
uchar xdata DiZh_Rx_Buff[DiZh_BUFF_MAX]; //地震
uchar xdata DiZh_Tx_Buff[DiZh_BUFF_MAX];
uchar xdata KEY_RX_Buff[KEY_BUFF_MAX]; //屏
uchar xdata KEY_TX_Buff[KEY_BUFF_MAX];
uchar xdata F76_RX_Buff[F76_BUFF_MAX]; //床体
uchar xdata F76_TX_Buff[F76_BUFF_MAX];
bit XinKey_Sound_b=0; //用于发声音
bit Xin_KeyJTX_RX_B=0; //甲天行来的标志位
bit XinKey_b=0; //手柄来的键值标志
uchar xdata XinKey_Value, itask; //手柄来的键值
bit Dis_All_Key_B=0; //不检测按键标志位 1:不检测 0:检测
void Fa_F76_buffer_0xee0xee(uchar Fun,uchar *Poit,uint Lenthg) reentrant ;
bit bUartBusy; //上位机串口发送状态标志,"1"表示上位机串口"忙"(正发送数据
//到子串口,新数据只需送入子串口发送缓冲区即可,"0"表示上位
//机串口"空闲",需用户程序将"TI=1"来启动子串口数据发送
bit bInstructFlag; //上位机发送指令请求标志,上位机需要发送指令时必须
//先将待发发送指令放到"InstructBuf",之后将该
//标志设置为"1"即可.标志变为"0"后可继续发送指令
bit KEY_TX_is_over_Start_cnt_B=0; // 帧间隔计时位
// //发送数据时要先检测此位为0才能发送数据
uchar KEY_TX_is_over_Start_cnt=0; // 帧间隔计时计数器
uchar xdata UartPointer; //子串口发送数据指针,中断服务程序通过该指针轮询
//发送数据到各子串口,保证各子串口的数据不丢失
uchar xdata InstructBuf; //指令缓冲(用户可将设置SP2328/SP2338的指令放入
//该寄存器,由驱动程序自动完成指令发送)
uchar MY_P4L;
uchar xdata Uart0RBuf,Uart1RBuf,Uart2RBuf; //接收子串口数据缓
unsigned char xdata F76_RX_Sta=0;
unsigned char xdata F76_RX_cnt=0;
unsigned char F76_Es_jie_cnt;
bit Xin_F76_RX_B=0;
unsigned char xdata KEY_RX_Sta=0;
unsigned int xdata KEY_RX_cnt=0;
unsigned char KEY_Es_jie_cnt;
bit Xin_KEY_RX_B=0;
unsigned char xdata DiZh_RX_Sta=0;
unsigned int xdata DiZh_RX_cnt=0;
unsigned char DiZh_Es_jie_cnt;
bit Xin_DiZh_RX_B=0;
uint xdata DiZh_TX_Len; //发送长度
uint xdata DiZh_TX_cnt=0; //发送计数器
bit DiZh_TX_is_over_B=1; //所完标志位
// GPRS_TX_is_over_B=0表示串口忙被 占用,
//谁得到 GPRS_TX_is_over_B=1谁就得到串口生理权
uint xdata KEY_TX_Len; //发送长度
uint xdata KEY_TX_cnt=0; //发送计数器
bit KEY_TX_is_over_B=1; //所完标志位
// KEY_TX_is_over_B=0表示串口忙被 占用,
//谁得到 KEY_TX_is_over_B=1谁就得到串口生理权
bit KEY_TX_Right_B=1; //key发送权标志
uint xdata F76_TX_Len; //发送长度
uint xdata F76_TX_cnt=0; //发送计数器
bit F76_TX_is_over_B=1; //所完标志位
// F76_TX_is_over_B=0表示串口忙被 占用,
//谁得到 F76_TX_is_over_B=1谁就得到串口生理权
//void Fa_F76_buffer(uint Lenthg);
//void Fa_Key_buffer(uint Lenthg);
//void Fa_DiZh_buffer(uint Lenthg);
/*****************************************************************************
功能:设定SP2328/SP2338输入、输出地址,可根据实际电路修改
*****************************************************************************/
//sbit AdrIn0 =P1^0; /* 连接到SP2328/SP2338的PIN0 (ADRO0)*/
//sbit AdrIn1 =P1^1; /* 连接到SP2328/SP2338的PIN1 (ADRO1)*/
//sbit AdrOut0=P1^2; /* 连接到SP2328/SP2338的PIN18(ADRI0)*/
//sbit AdrOut1=P1^3; /* 连接到SP2328/SP2338的PIN17(ADRI1)*/
void Fa_F76_buffer(uchar Fun,uchar *Poit,uint Lenthg) reentrant ;
void UART_1_ISR () interrupt 20 {
if (SCON1&0x01) //if (_testbit_(RI_1))
{
//RI=0; //准备解析刚接收到的数据来自于哪个子串口
if(AdrIn1)
{ //子串口2接收到一个字节
//子串口2 来键盘的数据
Uart2RBuf=SBUF1; //缓存子串口2收到的数据,以便接收后续数据
switch(KEY_RX_Sta) {
case 0:
if(Uart2RBuf==0xee)
KEY_RX_Sta=1;
break;
case 1:
if(Uart2RBuf!=0xee) {
KEY_Es_jie_cnt=10; //时限计时值 500ms in : TIME_LIMITED (void) _task_ TIMELIMITED
KEY_RX_Sta=2;
KEY_RX_Buff[0]=Uart2RBuf;
KEY_RX_cnt=1;
}
break;
case 2:
KEY_RX_Buff[KEY_RX_cnt++]=Uart2RBuf;
if( KEY_RX_cnt>=KEY_BUFF_MAX) {
KEY_RX_Sta=0;
}
if(Dis_All_Key_B==1) //不检测按键标志位 1:不检测 0:检测==1)
break;
if(Uart2RBuf==0xab) { // over byte flag
Xin_KEY_RX_B=1;
XinKey_b=1; //手柄来的键值标志
//XinKey_Value=KEY_RX_Buff[2]; //手柄来的键值
KEY_RX_Sta=0;
//========以下是优先电话功能==只允许挂机和接听键有效================
ima_cnt=0; //键盘拔号复0 计数器,超过16秒没人按键则复位为 ima=3;
}
break;
default:
KEY_RX_Sta=0;
break;
}
//Out55:;
}
else if(AdrIn0)
{ //子串口1接收到一个字节
//子串口1 来自报警板的数据
Uart1RBuf=SBUF1; //缓存子串口1收到的数据,以便接收后续数据
F76_RX_Buff[F76_RX_cnt++]=Uart1RBuf;
F76_Es_jie_cnt=16; //80ms 时限到认为接收结束in:
if(F76_RX_cnt>=F76_BUFF_MAX)
F76_RX_cnt=0;
/*
switch(F76_RX_Sta) {
case 0:
if(Uart1RBuf==0xee)
F76_RX_Sta=1;
break;
case 1:
if(Uart1RBuf!=0xee) {
F76_Es_jie_cnt=10; //时限计时值 500ms in : TIME_LIMITED (void) _task_ TIMELIMITED
F76_RX_Sta=2;
F76_RX_Buff[0]=Uart1RBuf;
F76_RX_cnt=1;
}
break;
case 2:
F76_RX_Buff[F76_RX_cnt++]=Uart1RBuf;
if( F76_RX_cnt>=F76_BUFF_MAX) {
F76_RX_Sta=0;
}
if(Uart1RBuf==0xab) { // over byte flag
Xin_F76_RX_B=1;
F76_RX_Sta=0;
}
break;
default:
F76_RX_Sta=0;
break;
}
*/
}
else { //子串口0接收到一个字节
//子串口0 来自DiZh 的数据
// if(Xin_DiZh_RX_B==0) { //未处理不能接收防止覆盖
Uart0RBuf=SBUF1; //缓存子串口0收到的数据,以便接收后续数据
DiZh_Rx_Buff[DiZh_RX_cnt++]=Uart0RBuf;
DiZh_Es_jie_cnt=16; //80ms 时限到认为接收结束in:
if(DiZh_RX_cnt>=DiZh_BUFF_MAX)
DiZh_RX_cnt=0;
//}
}
}
//以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
//以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
//以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
//以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
if (SCON1&0x02) //-->_testbit_(TI_1))
{
//TI=0; //已经产生发送中断,准备解析下一个需要发送的数据
switch(UartPointer){ //判断即将向哪个子串口发送数据?
case 0:{ //准备向子串口0发送数据
// 子串口0 fa DiZh 的数据
if( DiZh_TX_Len>DiZh_BUFF_MAX)
DiZh_TX_Len= DiZh_BUFF_MAX;
UartPointer++; //下一次发送中断准备向子串口1发送数据
if(DiZh_TX_Len){ //串口0发送缓存区是否有数据需要发送?
AdrOut0_0; //有数据需要发送,则选通子串口0的地址
AdrOut1_0;
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DiZh_TX_Len--;
DiZh_TX_is_over_B=0;
if(DiZh_TX_Len==0) {
DiZh_TX_is_over_B=1;
}
SBUF1=DiZh_Tx_Buff[DiZh_TX_cnt++];//将串口0发送缓存中的一个字节
break; //由子串口0发送到下位机
}
else
goto T_NopInstruction; //若子串口0没有数据发送则准备发送空指令
}
case 1:{ //准备向子串口1发送数据
//子串口1 来自报警板的数据
if( F76_TX_Len>F76_BUFF_MAX)
F76_TX_Len= F76_BUFF_MAX;
UartPointer++; //下一次发送中断准备向子串口2发送数据
if(F76_TX_Len){ //串口1发送缓存区是否有数据需要发送?
AdrOut0_1; //有数据需要发送,则选通子串口2的地址
AdrOut1_0;
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
F76_TX_Len--;
F76_TX_is_over_B=0;
if(F76_TX_Len==0) {
F76_TX_is_over_B=1;
//Dis_FA_485shou; //为推完,要上拉电阻
}
SBUF1=F76_TX_Buff[F76_TX_cnt++];//将串口1发送缓存中的一个字节
break; //由子串口1发送到下位机
}
else
goto T_NopInstruction; //若子串口1没有数据发送则准备发送空指令
}
case 2:{ //准备向子串口2发送数据
//子串口2 发给键盘的数据
if( KEY_TX_Len>KEY_BUFF_MAX)
KEY_TX_Len= KEY_BUFF_MAX;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -