You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
incubator_embeded/HARDWARE/rs485.c

588 lines
19 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "rs485.h"
#include "SysTick.h"
#include "USART.h"
#include "Relays.h"
#include "myfreertos.h"
u8 sendbuf[27]={0xEE,0xB5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFC,0xFF,0xFF};//发送给串口屏的实时数据
u8 sendbuf_crc[20]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
extern u8 global_buffer[64];
extern u8 RS485_RX_BUF_COPY[128];
extern u8 now_stage;
extern u8 chour;
extern u8 cminute;
extern u8 total[];
extern u8 hot_clod_flag;
extern u8 humidity_flag;
extern u8 ALARM;
extern u8 NUM;
u8 TEM1;
u8 TEM2;
u8 HUM1;
u8 HUM2;
u8 CO2_1;
u8 CO2_2;
u16 RED_LIGHT;
u16 WHITE_LIGHT;
u16 BLUE_LIGHT;
u8 red_light1;
u8 red_light2;
u8 white_light1;
u8 white_light2;
u8 blue_light1;
u8 blue_light2;
u8 crc_num1=0xFF;
u8 crc_num2=0xFF;
//extern u8 TEM1;
//extern u8 TEM2;
//extern u8 HUM1;
//extern u8 HUM2;
//extern u8 CO2_1;
//extern u8 CO2_2;
extern int T;
extern int H;
extern int C;
//extern u16 RED_LIGHT;
//extern u16 WHITE_LIGHT;
//extern u16 BLUE_LIGHT;
//extern u8 red_light1;
//extern u8 red_light2;
//extern u8 white_light1;
//extern u8 white_light2;
//extern u8 blue_light1;
//extern u8 blue_light2;
//CRC校验 自己后面添加的
const u8 auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;
const u8 auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;
u8 RS485_RX_BUF[128]; //接收缓冲,最大64个字节.
u8 RS485_RX_CNT=0; //接收到的数据长度
u8 RS485_RX_Flag=0; //接收到的数据标志
void GetCRC16(u8 *puchMsg, u16 usDataLen,u8 *uchCRCHi,u8 *uchCRCLo)
{
*uchCRCHi = 0xFF ;
*uchCRCLo = 0xFF ;
u32 uIndex ;
while (usDataLen--)
{
uIndex = *uchCRCHi ^ *puchMsg++ ;
*uchCRCHi = *uchCRCLo ^ auchCRCHi[uIndex] ;
*uchCRCLo = auchCRCLo[uIndex] ;
}
//return ((uchCRCHi<< 8) | (uchCRCLo)) ;
}
// 查表法计算CRC值并且校验
u8 CRC16_check(u8 *puchMsg, u16 usDataLen)
{
u8 uchCRCHi = 0xFF ;
u8 uchCRCLo = 0xFF ;
u32 uIndex ;
while (usDataLen--)
{
uIndex = uchCRCHi ^ *puchMsg++ ;
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
if(uchCRCHi==*puchMsg++&&uchCRCLo==*puchMsg++)
{
printf("CRC 校验成功\r\n"); // 调试使用
return 1;
}
else
return 0;
}
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据
{
res =USART_ReceiveData(USART1); //读取接收到的数据
if(RS485_RX_CNT<128)
{
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
RS485_RX_CNT++; //接收数据增加1
}
}
}
void SN74CB3Q3253_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7; //PB5 PB6 PB7 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 IO口速度为50MHz
GPIO_ResetBits(GPIOB,GPIO_Pin_7); //PB7输出低
}
//RS485_1_Init->J6 PB5->S1,PB6->S0,PB7->USART_OE
//SN74CB3Q3253多路复用器 - 多路信号分离器的引脚配置为OE S1 S0对应的值为001使1B2 2B2响应
//初始化IO 串口1
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void RS485_1_Init(u32 bound)
{
SN74CB3Q3253_Init();
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//S1配置为低电平
GPIO_SetBits(GPIOB,GPIO_Pin_6);//S0配置为高电平
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOA,D时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); ; //初始化串口
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART1, ENABLE); //使能串口
RS485_1_TX_EN=0; //默认为接收模式
}
//RS485_2_Init->J7 PB5->S1,PB6->S0,PB7->USART_OE
//SN74CB3Q3253多路复用器 - 多路信号分离器的引脚配置为OE S1 S0对应的值为000使1B1 2B1响应
void RS485_2_Init(u32 bound)
{
SN74CB3Q3253_Init();
GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6);//S1,S0配置为低电平
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOA,D时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); ; //初始化串口
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级2级
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART1, ENABLE); //使能串口
RS485_2_TX_EN=0; //默认为接收模式
}
//RS485_3_Init->J7 PB5->S1,PB6->S0,PB7->USART_OE
//SN74CB3Q3253多路复用器 - 多路信号分离器的引脚配置为OE S1 S0对应的值为010使1B3 2B3响应
void RS485_3_Init(u32 bound)
{
SN74CB3Q3253_Init();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//S0配置为低电平
GPIO_SetBits(GPIOB,GPIO_Pin_5);//S1配置为高电平
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOA,D时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); ; //初始化串口
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级2级
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART1, ENABLE); //使能串口
RS485_3_TX_EN=0; //默认为接收模式
}
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_1_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_1_TX_EN=1; //设置为发送模式
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,buf[t]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
RS485_RX_CNT=0;
RS485_1_TX_EN=0; //设置为接收模式
}
void RS485_1_Send_Data_1(u8 *buf,u8 len)
{
u8 t;
RS485_1_TX_EN=1; //设置为发送模式
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,buf[t]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
//RS485_RX_CNT=0;
RS485_1_TX_EN=0; //设置为接收模式
}
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_1_Send_Data_2(void)//上传温湿度二氧化碳
{
u8 a;
RS485_1_TX_EN=1; //设置为发送模式
if(T<=500)
{
TEM1=RS485_RX_BUF_COPY[3];
TEM2=RS485_RX_BUF_COPY[4];
}
if(H<=1000)
{
HUM1= RS485_RX_BUF_COPY[5];
HUM2= RS485_RX_BUF_COPY[6];
}
sendbuf[3]=TEM1;
sendbuf[4]=TEM2;
sendbuf[5]=HUM1;
sendbuf[6]=HUM2;
RED_LIGHT=total[9 + 18 * (now_stage - 1)]<<8|total[10 + 18 * (now_stage - 1)];
BLUE_LIGHT=total[11 + 18 * (now_stage - 1)]<<8|total[12 + 18 * (now_stage - 1)];
WHITE_LIGHT=total[13 + 18 * (now_stage - 1)]<<8|total[14+ 18 * (now_stage - 1)];
if(RED_LIGHT<=1000)
{
red_light1=total[9 + 18 * (now_stage - 1)];
red_light2=total[10 + 18 * (now_stage - 1)];
}
if(BLUE_LIGHT<=1000)
{
blue_light1=total[11 + 18 * (now_stage - 1)];
blue_light2=total[12 + 18 * (now_stage - 1)];
}
if(WHITE_LIGHT<=1000)
{
white_light1=total[13 + 18 * (now_stage - 1)];
white_light2=total[14 + 18 * (now_stage - 1)];
}
sendbuf[7]=red_light1;
sendbuf[8]=red_light2;//红光
sendbuf[9]=blue_light1;
sendbuf[10]=blue_light2; //蓝光
sendbuf[11]=white_light1;
sendbuf[12]=white_light2;//白光
// sendbuf[13]=RS485_RX_BUF[19];
// sendbuf[14]=RS485_RX_BUF[20];//CO2
if(C<=5000)
{
CO2_1=RS485_RX_BUF_COPY[19];
CO2_2=RS485_RX_BUF_COPY[20];
}
sendbuf[13]=CO2_1;
sendbuf[14]=CO2_2;
if(now_stage<7)
{
sendbuf[15]=now_stage;//当前阶段
}
if(total[3 + 18 * (now_stage - 1)]<24)
{
sendbuf[16]=total[3 + 18 * (now_stage - 1)];//阶段小时
}
if(total[4 + 18 * (now_stage - 1)]<60)
{
sendbuf[17]=total[4 + 18 * (now_stage - 1)];//阶段分钟
}
if(chour<24)
{
sendbuf[18]=chour; //已运行小时数
}
if(cminute<60)
{
sendbuf[19]=cminute;//已运行分钟数
}
sendbuf[20]=hot_clod_flag;//加热制冷状态
sendbuf[21]= humidity_flag;//加湿干燥状态
//printf("%d\r\n", humidity_flag);
sendbuf[22]=ALARM;//报警状态状态
// bufcut_Init(sendbuf_crc,sendbuf,3,23);
// GetCRC16(sendbuf_crc,20,&crc_num1,&crc_num2);
// sendbuf[23]=crc_num1;
// sendbuf[24]=crc_num2;
// for(int i=0;i<20;i++)
// {
// printf("%x ",sendbuf_crc[i]);
// }
//
// printf("\r\n");
// for(int i=0;i<29;i++)
// {
// printf("%x ",sendbuf[i]);
// }
sendbuf[0]=0xEE;
sendbuf[1]=0xB5;
sendbuf[2]=0x05;
sendbuf[23]=0xFF;
sendbuf[24]=0xFC;
sendbuf[25]=0xFF;
sendbuf[26]=0xFF;
//printf("%x\r\n",sendbuf[0]);
for(a=0;a<27;a++) //循环发送数据
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,sendbuf[a]);
//if(a==0)printf("%x\r\n",sendbuf[0]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
//RS485_RX_CNT=0;
RS485_1_TX_EN=0; //设置为接收模式
}
void RS485_1_Send_Data_3(void)
{
u8 batchbuf[8]={0xEE,0xB5,0x01,0x00,0xFF,0xFC,0xFF,0xFF};
u8 t;
RS485_1_TX_EN=1; //设置为发送模式
batchbuf[3]=NUM;
NUM+=1;
if(NUM>6)NUM=1;
for(t=0;t<8;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,batchbuf[t]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
//RS485_RX_CNT=0;
RS485_1_TX_EN=0; //设置为接收模式
}
// void RS485_3_Send_Data_2(void)//上传当前周期(1),周期时长(2),已运行时长(2),红蓝白光(6),加热制冷状态(1),加湿除湿状态(1),报警状态(1)
//{
// delay_ms(50);
// u8 sendbuf[21]={0xEE,0xB5,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFC,0xFF,0xFF};//发送给串口屏的实时数据
// u8 a;
// GPIO8_Init();
// GPIO_SetBits(GPIOB,GPIO_Pin_8);
// RS485_3_TX_EN=1; //设置为发送模式
// sendbuf[3]=t;
// sendbuf[4]=total[3 + 18 * (t - 1)];
// sendbuf[5]=total[4 + 18 * (t - 1)];
// sendbuf[6]=chour;
// sendbuf[7]=cminute;
// sendbuf[8]=total[9 + 18 * (t - 1)];
// sendbuf[9]=total[10 + 18 * (t - 1)];
// sendbuf[10]=total[11 + 18 * (t - 1)];
// sendbuf[11]=total[12 + 18 * (t - 1)];
// sendbuf[12]=total[13 + 18 * (t - 1)];
// sendbuf[13]=total[14 + 18 * (t - 1)];
// sendbuf[14]=hot_clod_flag;
// sendbuf[15]= humidity_flag;
// sendbuf[16]=ALARM;
//
//
// for(a=0;a<21;a++) //循环发送数据
// {
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// USART_SendData(USART1,sendbuf[a]);
// }
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// RS485_RX_CNT=0;
// GPIO_ResetBits(GPIOB,GPIO_Pin_8);
// RS485_3_TX_EN=0; //设置为接收模式
//}
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
//void RS485_3_Send_Data(u8 *buf,u8 len)
//{
// u8 t;
// GPIO8_Init();
// GPIO_SetBits(GPIOB,GPIO_Pin_8);
// RS485_3_TX_EN=1; //设置为发送模式
// for(t=0;t<len;t++) //循环发送数据
// {
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// USART_SendData(USART1,buf[t]);
// }
//
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// RS485_RX_CNT=0;
// GPIO_ResetBits(GPIOB,GPIO_Pin_8);
// RS485_3_TX_EN=0; //设置为接收模式
//}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0; //默认为0
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
buf[i]=RS485_RX_BUF[i];
}
*len=RS485_RX_CNT; //记录本次数据长度
RS485_RX_CNT=0; //清零
}
}