📄 gsm-dtu-gr47avr.c
字号:
meter_rx_a_buffer2[3]=info_buffer[5];
meter_rx_a_buffer2[4]=0;
meter_rx_a_buffer2[5]=0;
meter_rx_a_buffer2[6]=0;
info_meter_rx_flag=1; //表示第二次数据接收成功
}
}
else
{
WDR();
delay_us(50);
}
}
}////第二次FA
// }
///////////////////////
/* else
{//B类仪表
info_meter_rx_flag=0;
//发指令57 01 56 31 30 02 03 BD
//01 56 31 30 02 36 33 2E 36 20 20 20 20 20 20 63 6D 20 20 20 20 03 9A (23个字节)
//,此时返回的数据包的第6个到第12个字节是数据,作为模块采集到的数据1;
USART0_Transmit(0x57);
USART0_Transmit(0x01);
USART0_Transmit(0x56);
USART0_Transmit(0x31);
USART0_Transmit(0x30);
USART0_Transmit(0x02);
USART0_Transmit(0x03);
USART0_Transmit(0xBD);
//等待1S
delay_ms(1000);
USART0_Transmit(0x57);
USART0_Transmit(0x01);
USART0_Transmit(0x56);
USART0_Transmit(0x31);
USART0_Transmit(0x30);
USART0_Transmit(0x02);
USART0_Transmit(0x03);
USART0_Transmit(0xBD);
//meter_rx_a_buffer1[7]
//meter_rx_a_buffer2[7]
//meter_rx_a_buffer3[7]
//接收第一个数据参量
//info_meter_rx_flag
WDR();
info_lenght=0x00;
for(i=0;i<250;i++)
{
if(UCSR0A&(1<<RXC0))
{
info_buffer[info_lenght]=UDR0;
info_lenght++;
i=1;
if(info_lenght==23)
{
i=250;
meter_rx_a_buffer1[0]=info_buffer[5];
meter_rx_a_buffer1[1]=info_buffer[6];
meter_rx_a_buffer1[2]=info_buffer[7];
meter_rx_a_buffer1[3]=info_buffer[8];
meter_rx_a_buffer1[4]=info_buffer[9];
meter_rx_a_buffer1[5]=info_buffer[10];
meter_rx_a_buffer1[6]=info_buffer[11];
info_meter_rx_flag=1; //表示接收成功
}
}
else
{
WDR();
delay_us(500);
}
}
//接收第二个参量
//57 01 76 31 30 02 03 DD
//01 76 31 30 02 32 34 2E 34 31 20 20 20 20 20 64 65 67 20 43 20 03 29 (23个字节),
//此时返回的数据包的第3个到第6个字节是数据,作为模块采集到的数据2;
info_meter_rx_flag=0;
USART0_Transmit(0x57);
USART0_Transmit(0x01);
USART0_Transmit(0x76);
USART0_Transmit(0x31);
USART0_Transmit(0x30);
USART0_Transmit(0x02);
USART0_Transmit(0x03);
USART0_Transmit(0xDD);
info_lenght=0x00;
for(i=0;i<250;i++)
{
if(UCSR0A&(1<<RXC0))
{
info_buffer[info_lenght]=UDR0;
info_lenght++;
i=1;
if(info_lenght==23)
{
i=250;
meter_rx_a_buffer2[0]=info_buffer[5];
meter_rx_a_buffer2[1]=info_buffer[6];
meter_rx_a_buffer2[2]=info_buffer[7];
meter_rx_a_buffer2[3]=info_buffer[8];
meter_rx_a_buffer2[4]=info_buffer[9];
meter_rx_a_buffer2[5]=info_buffer[10];
meter_rx_a_buffer2[6]=info_buffer[11];
info_meter_rx_flag=1;
}
}
else
{
WDR();
delay_us(500);
}
}
} */
///组合保存数据流,在info_buffer中
//时间
//for(i=0;i++;i<6)
for(i=0;i<6;i++)
{
info_buffer[i]=now_time_hex[i];
}
//数据1,2,3
j=6;
// for(i=0;i++;i<6)
for(i=0;i<7;i++)
{
info_buffer[j]=meter_rx_a_buffer1[i];
j++;
}
// for(i=0;i++;i<6)
for(i=0;i<7;i++)
{
info_buffer[j]=meter_rx_a_buffer2[i];
j++;
}
//for(i=0;i++;i<6)
for(i=0;i<7;i++)
{
info_buffer[j]=meter_rx_a_buffer3[i];
j++;
}
//判断当前电池状态, pine, power_detect
if(PINE&(1<<power_detect))
{
batt_status=00;
}
else //低压
{
batt_status=1;
}
info_buffer[j]=batt_status;
j++;
info_buffer[j]=0x20;
j++;
info_buffer[j]=0x20;
///
//开始保存
//data_save_sequence_num=0; eeprom adress 130
//data_save_sequence_num=1; eeprom adress 160
//data_save_sequence_num=2; eeprom adress 190
//data_save_sequence_num=3; eeprom adress 220
// 读出当前该保存的序号, 取出起始地址,保存, 保存序号+1,存入EEPROM
data_save_No=EEPROM_read(0x03);
if(data_save_No>99)
{
data_save_No=0;
}
PORTB &=~(1<< r232_onoff); //禁止UART0
_CLI();
//取出起始地址
eeprom_data_addr=meter_data_eeprom_start_addr[data_save_No]; //16位
for(i=0;i<30;i++)
{
EEPROM_write(eeprom_data_addr,info_buffer[i]);
eeprom_data_addr++;
WDR();
}
//保存完30个数
//在EEPROM里面存入下次的序号
data_save_No++;
EEPROM_write(0x03,data_save_No);
/*
switch(data_save_sequence_num)
{
case 0: j=130;
for(i=0;i<30;i++)
{
EEPROM_write(j,info_buffer[i]);
j++;
WDR();
}
break;
case 1: j=160;
for(i=0;i<30;i++)
{
EEPROM_write(j,info_buffer[i]);
j++;
WDR();
}
break;
case 2: j=190;
for(i=0;i<30;i++)
{
EEPROM_write(j,info_buffer[i]);
j++;
WDR();
}
break;
case 3: j=220;
for(i=0;i<30;i++)
{
EEPROM_write(j,info_buffer[i]);
j++;
WDR();
}
break;
}
*/ // switch
//_SEI();
delay_ms(5);
} //if (now_time_hex[5]==0x04) 05 06
else
{
}
}
///////////////
///中断入口程序
/************************************************************************************
* function: main()
* use:
* input parameter: None
* output parameter: None
************************************************************************************/
void main(void)
{
uchar i, j,time_temp;
uchar csreg ;
WDR();
WDTCR=0x1f;
WDTCR=0x0f;
io_init(); //I/O初始化
PORTC |=(1<<power_onoff); //1 关掉GSM电源
uart_out_init(); //串口初始化
WDR();
if(MCUCSR&(1<<WDRF)) // if((MCUCSR & 0x08)==0x08)
{ //看门狗复位
MCUCSR = 0;
}
else //上电复位
{
MCUCSR = 0;
PORTC &=~(1<<power_onoff); //开启GSM模块电源
delay_ms(2000); /
PORTC &=~(1<<gsm_onoff);
delay_ms(2000);
PORTC |=(1<<gsm_onoff); //1
//判断时间格式, 如果正常,表示上电复位后直接进入原来模式
if((i2c_Read(0x60)>0x05)&&((i2c_Read(0x60)<0x09)||(i2c_Read(0x60)==0x09))&&(i2c_Read(0x50)>0)&&(i2c_Read(0x50)<0x13)&&(i2c_Read(0x40)>0)&&(i2c_Read(0x40)<0x32) )
{
WDR();
}
else //时间格式不对,则进入等待设置模式
{
WDR();
EEPROM_write(0x02, 0x00); //上电自动为未设置模式
}
delay_ms(12000); //确保网络
gsm_init(); //GSM初始化
if(gsm_init_flag==1)
{
}
else
{
}
}
read_save_model_info(); //读出eeprom 模块参数设置内容,分别保存
WDR();
while(1)
{
//读DTU模块第一次设置标志,0x02 单元不是0xd9,则说明模块还从未设置
switch(EEPROM_read(0x02))
{
case 0xd9: //已设置过
/*
判断模式,等待短信,功能命令处理
*/
break;
default : //模块从未设置
//只响应短消息设置和读本模块参数设置两条指令
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -