📄 serial1.c
字号:
UartPointer++; //下一次发送中断准备向子串口2发送数据
if(KEY_TX_Len){ //串口2发送缓存区是否有数据需要发送?
AdrOut0_0; //有数据需要发送,则选通子串口0的地址
AdrOut1_1;
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
KEY_TX_Len--;
KEY_TX_is_over_B=0;
if(KEY_TX_Len==0) {
KEY_TX_is_over_B=1;
KEY_TX_is_over_Start_cnt_B=1; // 帧间隔计时位
KEY_TX_is_over_Start_cnt=0; // 帧间隔计时计数器
}
SBUF1=KEY_TX_Buff[KEY_TX_cnt++];//将串口2发送缓存中的一个字节
break; //由子串口2发送到下位机
}
else
goto T_NopInstruction; //若子串口2没有数据发送则准备发送空指令
} //而只能够发送一条空指令用于时序配合
default:{
UartPointer=0; //下一次发送中断准备向串口0发送数据
T_NopInstruction:
AdrOut0_1; //选通目串口准备发送空指令或者其他指令
AdrOut1_1;
if(bInstructFlag){ //判断是否需要发送其他指令?
bInstructFlag=0; //清除指令发送标志
SBUF1=InstructBuf; //将需要发送的指令发送到串口扩展IC
break;
}
//else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
else if(F76_TX_Len|KEY_TX_Len|DiZh_TX_Len){//判断所有子串口的数据是否
SBUF1=0; //都已经全部发送完毕?若没有完毕则发送空指令
break;
}
else {bUartBusy=0;break;}//若所有子串口数据都已经发送完毕,则立即
} //清除"串口忙"标志(主程序将根据该标志来决定是否执行"TI=1"这条指令)
}
}
SCON1&=0xfc; //CKR TI, RI
}
/*****************************************************************
Function: OpenComm
Description: Sets the serial port up for debug use and resets
the ring buffer pointers to 0.
Parameters: None.
Returns: Nothing.
*****************************************************************/
// 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
void Open_URRA_1(void)
{
// SCON1=0xf0; /*设置串行口1工作于方式3,主从式*/
/*SM0_1 SM1_1 SM2_1 REN_1 TB8_1 RB8_1 TI_1 RI_1*/
/* 1 1 1 1 0 0 0 0 */
/*when SM2_1=1 receice addr */
TMOD |= 0x20; /* timer 1 mode 2: 8-Bit reload */
PCON|=0x10;//-->SMOD_1=1; /*bps double*/
CKCON |= 0x10; // Timer 1 derived from SYSCLK
TH1 = -(SYSCLK/BAUDRATE1/16); //11.0592 ->4800-115200
TR1 = 1; // Start Timer 1
SCON1 = 0x50; // Configure UART1 for mode 1, receiver enabled.
SCON1|=0x10;//--> REN1=1;
EIE2|=0x40; //--> ES1=1; // allow the serial interrupt
}
/**********************************************************************
**函数原型: void FA_DiZhen_Buff()
**入口参数:
**出口参数: 无
**返 回 值: 无
**说 明: 对地震仪发数据子程序
*************************************************************************/
void FA_DiZhen_Buff() {
DiZh_TX_Len= DiZh_Tx_Buff[3]+6;
DiZh_TX_cnt=0;
if(bUartBusy==0){ //判断发送中断是否处于激活状态,若没有激活则:
SCON1|=2; //TI=1; //激活MCU的串口发送程序
bUartBusy=1; //置发送程序已经激活的标志
}
}
//等待得到控制权
//等待得到控制权
//只有得到权限才能更新缓冲区数据
/*
void Get_Fa_DiZh_buffer_Right( )
{ xdata uchar ttt=0;
while(DiZh_TX_is_over_B==0) { //TX所完标志位,没发完再发时要等待
os_wait2(K_TMO, 50); //100ms
if(ttt++>100) //延时5秒 到也认为发送有空
break;
}
DiZh_TX_is_over_B=0; //抢到标志,处暑、延时100MS再发, 串间隔
os_wait2(K_TMO, 50); //100ms
}
*/
//==============================w2812837@163.com=================================================
//等待得到控制权
//等待得到控制权
//只有得到权限才能更新缓冲区数据
/*
void Get_Fa_Key_buffer_Right( )
{ xdata uchar ttt=0;
while(KEY_TX_is_over_B==0) { //TX所完标志位,没发完再发时要等待
os_wait2(K_TMO, 50); //100ms
if(ttt++>90) //延时5秒 到也认为发送有空
break;
}
KEY_TX_is_over_B=0; //抢到标志,处暑、延时100MS再发, 串间隔
os_wait2(K_TMO, 50); //100ms
}
*/
/**********************************************************************
**函数原型: void Fa_Key_buffer(uint Lenthg)
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 将KEY_TX_Buff[]发送子程序。
// 发送入口,TX_Len:所发送的字节数
// KEY_TX_Buff[]: 发送缓冲区
// TxIe=1;
// KEY_TX_cnt=0; 100MS 串间隔
************************************************************************/
void Fa_Key_buffer(uint Lenthg)
{
// En_FA_485; // if use 485 ic
KEY_TX_cnt=0;
KEY_TX_Len=Lenthg; //TX_LEN发送前置好数值
if(bUartBusy==0){ //判断发送中断是否处于激活状态,若没有激活则:
SCON1|=2; //TI=1; //激活MCU的串口发送程序
bUartBusy=1; //置发送程序已经激活的标志
}
}
//==============================w2812837@163.com=================================================
/**********************************************************************
**函数原型: void Fa_F76_buffer(uint Lenthg)
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 将F76_TX_Buff[]发送子程序。
// 发送入口,TX_Len:所发送的字节数
// F76_TX_Buff[]: 发送缓冲区
// TxIe=1;
// F76_TX_cnt=0; 100MS 串间隔
************************************************************************/
void Fa_F76_buffer_0xee0xee(uchar Fun,uchar *Poit,uint Lenthg) reentrant
{
uchar i,j;
//Get_Fa_F76_buffer_Right( );
//Clr_F76_RX_Buff();
F76_RX_cnt=0;
Xin_F76_RX_B=0;
//En_FA_485shou; // if use 485 ic
F76_TX_Buff[0]=0xEE;;
F76_TX_Buff[1]=0xEE;
F76_TX_Buff[2]=Fun ;
F76_TX_Buff[3]=Lenthg;
for(i=0;i<Lenthg;i++) {
F76_TX_Buff[4+i]=*Poit++;
}
F76_TX_Buff[4+i]=0;
j=0;
for(j=0;j<(Lenthg+2);j++)
F76_TX_Buff[4+i]+= F76_TX_Buff[j+2];
F76_TX_Buff[4+i+1]=0xab;
F76_TX_cnt=0;
F76_TX_Len=Lenthg+6; //TX_LEN发送前置好数值
if(bUartBusy==0){ //判断发送中断是否处于激活状态,若没有激活则:
SCON1|=2; //TI=1; //激活MCU的串口发送程序
bUartBusy=1; //置发送程序已经激活的标志
}
}
//==============================w2812837@163.com=================================================
/**********************************************************************
**函数原型: void Fa_F76_buffer(uint Lenthg)
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 将F76_TX_Buff[]发送子程序。
// 发送入口,TX_Len:所发送的字节数
// F76_TX_Buff[]: 发送缓冲区
// TxIe=1;
// F76_TX_cnt=0; 100MS 串间隔
************************************************************************/
void Fa_F76_buffer(uchar Fun,uchar *Poit,uint Lenthg) reentrant
{
uchar i,j;
//Get_Fa_F76_buffer_Right( );
//Clr_F76_RX_Buff();
F76_RX_cnt=0;
Xin_F76_RX_B=0;
//En_FA_485shou; // if use 485 ic
i=0;
F76_TX_Buff[0]=0xEE;;
F76_TX_Buff[1]=0xEE;
F76_TX_Buff[2]=Fun ;
F76_TX_Buff[3]=Lenthg;
for(i=0;i<Lenthg;i++) {
F76_TX_Buff[4+i]=*Poit++;
}
F76_TX_Buff[4+i]=0;
j=0;
for(j=0;j<(Lenthg+2);j++)
F76_TX_Buff[4+i]+= F76_TX_Buff[j+2];
F76_TX_Buff[4+i+1]=0xab;
F76_TX_cnt=0;
F76_TX_Len=Lenthg+6; //TX_LEN发送前置好数值
if(bUartBusy==0){ //判断发送中断是否处于激活状态,若没有激活则:
SCON1|=2; //TI=1; //激活MCU的串口发送程序
bUartBusy=1; //置发送程序已经激活的标志
}
}
//==============================w2812837@163.com=================================================
//清接收区为0
void Clr_DiZh_Rx_Buff() {
uint i;
for (i=0;i<DiZh_BUFF_MAX;i++)
DiZh_Rx_Buff[i]=0;
}
//清接收区为0
void Clr_KEY_RX_Buff() {
uint i;
for (i=0;i<KEY_BUFF_MAX;i++)
KEY_RX_Buff[i]=0;
}
//清接收区为0
void Clr_F76_RX_Buff() {
uint i;
for (i=0;i<F76_BUFF_MAX;i++)
F76_RX_Buff[i]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -