新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2020-4-29
- 在线时间
- 10 小时
|

楼主 |
发表于 2020-6-6 08:51:31
|
显示全部楼层
#define FLASH_SAVE_ADDR 0X08007000 //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
#define FLASH_SAVE_ADDR1 0X08007010
void Uart1_send(uint8_t *pData,uint16_t rx_len)
{
}
u16 Databuf[300];
u16 pBuffer;
uint8_t return_data[300];
static void Return_data(uint16_t addr,uint8_t cmd,uint8_t len);
u8 rs485buf[64];
int main(void)
{
u16 i,led_sta = 0;
u16 data_addr=0X0000;//寄存器的起始地址
u16 data;//数据
u16 crc=0;
short oo2;
u16 g_usAddr;
u16 v_o2;
u8 rx_len = 0;
u8 strbuf[64];
short av=0;//平均值
int o;
delay_init(); //延时函数初始化
LED_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
RS485_Init(9600);
LED_Init(); //LED端口初始化
Adc_Init();
IIC_Init();
OLED_Init();
STMFLASH_Read(FLASH_SAVE_ADDR,&g_usAddr,1);
STMFLASH_Read(FLASH_SAVE_ADDR1,&v_o2,1);
while(1)
{
oo2=Get_O2();
for(o=0;o<17;o++)
{
oo2=Get_O2();
av+=oo2;
}
av/=17;
#include "stm32f10x.h" // Device header
sprintf((char*)strbuf,"%.1f",(float)oo2/10);
OLED_P16x16Ch(0,2,0); //氧
OLED_P16x16Ch(18,2,1); //气
OLED_P16x16Ch(40,2,2); //浓
OLED_P16x16Ch(58,2,3); //度
OLED_P16x16Ch(80,2,4); //:
OLED_P8x16Str(0,4,(u8*)strbuf);
Databuf[0] = g_usAddr;
Databuf[1] = oo2;
Databuf[2] = v_o2;
LED1 = led_sta;
led_sta ^= 0x01;
RS485_Receive_Data(rs485buf,&rx_len);
if(rx_len == 8)//检验crc是否正确,标准长度是八位
{
crc = rs485buf[rx_len-2]; //crc等于数据长度-2的位
crc <<= 8; //左移八位
crc |= rs485buf[rx_len-1];
if(crc==CRC16(rs485buf,rx_len-2))
{
if(rs485buf[0] ==g_usAddr)//判断第零位是不是地址
{
data_addr = rs485buf[2];//寄存器
data_addr <<=8;
data_addr|= rs485buf[3];
data = rs485buf[4];//个数
data = data<<8;//左移八位
data += rs485buf[5];//第四位和第五位合并
switch(rs485buf[1])
{
case 0x03: //如果功能位等于03
for(i=0;i<data;i++) //
{
return_data[2*i+3]=Databuf[data_addr+i]/256;
return_data[2*i+4]=Databuf[data_addr+i]%256;
}
Return_data(g_usAddr,0x03,2*i);
break;
case 0x06:
if(data_addr == 0x0000)//如果接受的寄存器地址是0000
{
if (data > 0 && data < 0xFF)
{
STMFLASH_Write(FLASH_SAVE_ADDR, &data, 1);
RS485_Send_Data(rs485buf, rx_len);
NVIC_SystemReset();
}
}
if(data_addr == 0x0002)//如果接受的寄存器地址是0002
{
if (data > 0 && data < 0xFF)
{
STMFLASH_Write(FLASH_SAVE_ADDR1, &data, 1);
RS485_Send_Data(rs485buf, rx_len);
NVIC_SystemReset();
}
}
break;
default:
break;
}
}
}
}
}
}
void Return_data(uint16_t addr,uint8_t cmd,uint8_t len)
{
uint16_t crc;
return_data[0]=addr;
return_data[1]=cmd;
return_data[2]=len;
crc = CRC16(return_data,len+3);
return_data[len+3]=crc/256;
return_data[len+4]=crc%256;
RS485_Send_Data(return_data,len+5);
}
|
|