📄 sl.c
字号:
else if (STI)
{ // If Transmit Complete:
STI = 0; // Clear transmit flag.
if (Ini_Data_Num_Send<23) // If less than 15 characters transmitted:
{
STXBSY = 1; // Claim SW_UART Transmitter.
TDR = *(Ini_Data_BufferPoint+Ini_Data_Num_Send);
Ini_Data_Num_Send++; // Increment variable, transmit.
CCF1 = 1; // Force module 0 interrupt to initiate TX
}
else
{
Ini_Data_Num_Send=0;
}
Ini_Data_Flag=0;
}
}
//--------------------------------------------------------------
//WAVECOM 数据接收子程序:串口0中断服务程序
void Serial0_WAVECOM(void) interrupt 4
{
EA=0;
if (RI0)
{
RI0=0;
if(RECEIVE_FLAG==0)
{
if(SBUF0==0x7E)
{
RECEIVE_FLAG=1;
RECEIVEBUFFERPOINT=RECEIVEBUFFER;
WAVE_Receive_Num = 0;
}
}
else
{
if(SBUF0==0x7E)
{
if(RECEIVEBUFFERPOINT!=RECEIVEBUFFER) //排除连续收到两个7E,数据长度为0的错误情况
{
RECEIVE_FLAG=0;
PPP_Rec_Complete = 1;
}
}
else
{
if(PADDING_Flag==1)
{
*RECEIVEBUFFERPOINT=SBUF0;
*RECEIVEBUFFERPOINT^=0x20;
PADDING_Flag=0;
RECEIVEBUFFERPOINT++;
WAVE_Receive_Num++;
}
else
{
if(SBUF0==0x7D)
PADDING_Flag=1;
else
{
*RECEIVEBUFFERPOINT=SBUF0;
RECEIVEBUFFERPOINT++;
WAVE_Receive_Num++;
}
}
}
}
}
EA=1;
}
//-------------------------------------------------------------
//-------------------------------------------------------------
// 采集板数据接收子程序:串口1中断服务程序
// Head_Flag=0x0E End_Flag=0x05 0x0A means 0x7D
// when x<0x10 ,x= 0x7D x^0x10
void Serial1_CaiJi(void) interrupt 20
{
if((SCON1 & 0x01)!=0x00){
SCON1 &= 0xFE; // 清串口1标字位
if(SBUF1==0x0E){ // 接收帧头
Receive_Flag_UART1=1;
CAIJI_Receive_Len = 0;
}
else{
if(Receive_Flag_UART1==1){
if(SBUF1==0x05){
Receive_Flag_UART1=0;
Padding_Flag_UART1=0;
UART1_Rec_Complete=1;
}
else if(Padding_Flag_UART1==1){
Padding_Flag_UART1=0;
Receive_Buf_UAR1[CAIJI_Receive_Len] = SBUF1;
Receive_Buf_UAR1[CAIJI_Receive_Len] ^= 0x7D;
CAIJI_Receive_Len++;
}
else if(SBUF1==0x7D){
Padding_Flag_UART1=1;
}
else if(SBUF1==0x0A){
Receive_Buf_UAR1[CAIJI_Receive_Len] = 0x7D;
CAIJI_Receive_Len++;
}
else{
Receive_Buf_UAR1[CAIJI_Receive_Len] = SBUF1;
CAIJI_Receive_Len++;
}
}
}
}
}
// 定时发送测试帧子程序 :外部中断0
void TestNetwork(void) interrupt 0
{
unsigned char xdata temp1;
unsigned char xdata temp2;
Timer_Num++;
// 测试间隔到否
CS_RTC = 1;
if(Timer_Num == XBYTE[StartAddress + Time_Interval])
{
if(Test_Frame_Answer == 1)
{
WDTCN = 0xa5; // 重启
}
else
{
Send_Test_Frame = 1;
Test_Frame_Answer = 1;
Timer_Num = 0;
}
}
CS_RTC=0;读时钟芯片的寄存器C
temp1 = RegC; //,用于中断标志位清0
while(RegA & 0x80 != 0x00);
temp1 = Hour;
temp2 = Minute;
CS_RTC=1;
//测试定时采集到否
if((temp1 == XBYTE[StartAddress+UP_Send_Time]) && (temp2 == XBYTE[StartAddress+UP_Send_Time+1]))
{
Timer_Gather_Flag = 1;
}
}
// -------------------------------------------------------------------
// 外部FLASH处理程序代码
//擦除FLASH子程序
void Erase_Chip(void)
{
unsigned int i,j;
Address5555=0xAA;
Address2AAA=0x55;
Address5555=0x80;
Address5555=0xAA;
Address2AAA=0x55;
Address5555=0x10;
for(i=0;i<1000;i++) for(j=0;j<1000;j++);
}
//擦除FLASH扇区子程序
void Erase_Sector(unsigned int w_address)
{
unsigned int i,j;
Address5555=0xAA;
Address2AAA=0x55;
Address5555=0x80;
Address5555=0xAA;
Address2AAA=0x55;
XBYTE[w_address]=0x30;
for(i=0;i<100;i++) for(j=0;j<1000;j++);
}
//写FLASH操作子程序
void Write_Byte(unsigned int w_address, unsigned char w_byte)
{
unsigned int i;
CS_RTC=1;
Address5555=0xAA;
Address2AAA=0x55;
Address5555=0xA0;
XBYTE[w_address]=w_byte;
for(i=0;i<1000;i++); //for(i=0;i<10000;i++); 减少10倍
CS_RTC=0;
}
// ------------------------------------------------------------------
// ------------------------------------------------------------------
// 应用程序校验代码
void CHECKSUM_UDP(unsigned int Data_length)
{
unsigned char i;
long sum;
unsigned char xdata Temp_Buffer[350];
sum = cksum(IP_Head,20);
IP_Head[10] = ((sum >> 8) & 0x00ff);
IP_Head[11] = (sum & 0x00ff); // least significant byte first
for(i=0;i<8;i++) Temp_Buffer[i] = IP_Head[i+12];
Temp_Buffer[8] = 0x0;
Temp_Buffer[9] = IP_Head[9];
Temp_Buffer[10] = UDP_Head[4];
Temp_Buffer[11] = UDP_Head[5];
for(i=0;i<8;i++) Temp_Buffer[i+12] = UDP_Head[i];
for(i=0;i<Data_length;i++)Temp_Buffer[i+20] = WAVE_Command_Buf[i];
sum = cksum(Temp_Buffer,20+Data_length);
UDP_Head[6] = ((sum >> 8) & 0x00ff);
UDP_Head[7] = (sum & 0x00ff); // least significant byte first
}
//-------------------------------------------------------------------------------------------------------
long cksum(unsigned char *ip, int len)
{
register long sum = 0;
while( len > 1 )
{
sum += *((unsigned short *)ip)++;
len -= 2;
}
if( len > 0 )
sum += *(unsigned char *)ip;
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
return ~sum;
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// 应用程序段
void SEND_DATA_WAVECOM(unsigned int data_len)
{
unsigned int i;
unsigned char xdata Temp_Buffer[400];
unsigned int buffer_len=0;
/*
// 网络不同且没经过初始化,不允许发数据
if((GPRS_OK !=1) || (Init_Flag != 1))
{
return;
}
// 如为奇数后面补0
i = data_len%2;
if(i!=0)
{
WAVE_Command_Buf[data_len] = 0;
data_len++;
}
*/
*( unsigned int xdata *)(IP_Head+2)=28+data_len; // write total length to IP head
IP_Head[10]=IP_Head[11]=0x00; // clear check_sum buffer in IP_HEAD
*(unsigned int xdata *)(UDP_Head+4)=8+data_len; // write UDP length to UDP head
UDP_Head[6]=UDP_Head[7]=0x00; // clear check_sum buffer in UDP_HEAD
Frame_End[0]=Frame_End[1]=0x00; // clear FCS buffer
CHECKSUM_UDP(data_len);
for(i=0;i<2;i++) Temp_Buffer[buffer_len++] = Frame_Head[i];
for(i=0;i<20;i++) Temp_Buffer[buffer_len++] = IP_Head[i];
for(i=0;i<8;i++) Temp_Buffer[buffer_len++] = UDP_Head[i];
for(i=0;i<data_len;i++) Temp_Buffer[buffer_len++] = WAVE_Command_Buf[i];
for(i=0;i<3;i++) Temp_Buffer[buffer_len++] = Frame_End[i];
Fcs16(Temp_Buffer,buffer_len); // create FSC and write to buffer
for(i=0;i<11;i++) // send data to UART0
{
TI0 = 0;
SBUF0 = Temp_Buffer[i];
while(TI0==0); TI0 = 0;
}
SBUF0 = 0x7D;
while(TI0==0);TI0=0;
SBUF0 = 0x31;
while(TI0==0);TI0=0;
for(i=12;i<buffer_len-1;i++)
{
if(Temp_Buffer[i] == 0x7E){
SBUF0 = 0x7D;
while(TI0==0);TI0=0;
SBUF0 = 0x5E;
while(TI0==0);TI0=0;
}
else if(Temp_Buffer[i] == 0x7D){
SBUF0 = 0x7D;
while(TI0==0);TI0=0;
SBUF0 = 0x5D;
while(TI0==0);TI0=0;
}
/* else if(Temp_Buffer[i]< 0x20){
SBUF0 = 0x7D;
while(TI0==0);TI0=0;
SBUF0 = Temp_Buffer[i]^0x20;
while(TI0==0);TI0=0;
}*/
else{
SBUF0 = Temp_Buffer[i];
while(TI0==0);TI0=0;
}
}
SBUF0 = 0x7E;
while(TI0==0);TI0=0;
}
// 向采集板发送子程序
void SEND_DATA_CAIJI(unsigned char Data_Len)
{
unsigned char i;
unsigned char checksum=0;
for(i=0;i<Data_Len;i++)
{
checksum = checksum + CAIJI_Command_Buf[i];
}
CAIJI_Command_Buf[Data_Len] = checksum;
SCON1 &=0xFD;
SBUF1 = 0x0E; // 发送帧头
while(TI1==0); SCON1 &= 0xFD;
for(i=0;i<Data_Len+1;i++) // 发送数据
{
if(CAIJI_Command_Buf[i] == 0x7D)
{
SBUF1 = 0x0A;
while(TI1==0); SCON1 &=0xFD;
}
else if(CAIJI_Command_Buf[i]<0x10)
{
SBUF1 = 0x7D;
while(TI1==0); SCON1 &=0xFD;
SBUF1 = CAIJI_Command_Buf[i]^0x7D;
while(TI1==0); SCON1 &=0xFD;
}
else
{
SBUF1 = CAIJI_Command_Buf[i];
while(TI1==0); SCON1 &=0xFD;
}
}
SBUF1 = 0x05; // 发送帧尾
while(TI1==0); SCON1 &=0xFD;
}
// 采集板送来数据处理子程序
void DEAL_DATA_CAIJI(void)
{
unsigned int i;
unsigned char check_sum=0;
for(i=0;i<CAIJI_Receive_Len-1;i++)
{
CAIJI_Data_Buffer[i] = Receive_Buf_UAR1[i]; // 保存数据到数据缓存区
check_sum = check_sum + Receive_Buf_UAR1[i]; // 计算校验和
}
if(check_sum != Receive_Buf_UAR1[CAIJI_Receive_Len-1]) // 校验校验和
{
return;
}
// 数据传输正确,进行处理
CAIJI_Data_Len = CAIJI_Receive_Len - 1;
switch(CAIJI_Data_Buffer[1])
{
case 0xAA: // 应答代码
switch(CAIJI_Data_Buffer[2])
{
case 0x10:
// 普通命令应答处理
if(CAIJI_Data_Buffer[0] != (CAIJI_Send_SeqNr-1))
{
return; // 序列号不匹配,不作处理
}
// 停止向采集板命令重传
CAIJI_Resend_Flag = 0;
CAIJI_Timer = 0;
if(WAVE_Resend_Flag == 0)
{
TMR3CN &=0xFB; // 关闭定时器3
}
break;
case 0x20:
// 采集数据处理
Frame_Data_Deal();
break;
}
case 0x55:
switch(CAIJI_Data_Buffer[2])
{
case 0x00:
Trouble_Inform_Comm(); // 故障通知命令
break;
case 0x01:
Data_Ready_Comm(); // 数据准备好命令
break;
}
}
}
// 采集板送来的帧处理
void Frame_Data_Deal(void)
{
unsigned int i;
unsigned int address;
// 判断序列号
if(CAIJI_Data_Buffer[0] != CAIJI_Send_SeqNr-1 )
{
return;
}
// 判断帧序号
if(CAIJI_Data_Buffer[5] != Frame_Num)
{
return;
}
// 判断帧长度
if(CAIJI_Data_Buffer[3]>245)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -