#include "uart2.h"
#include "stdint.h"
#define EN_USART2_RX 1
#define DEBUG_P 1
#if DEBUG_P
#define DEBUG(args...) printf(args)
#else
#define DEBUG(args...) do{ }while(0)
#endif
uint8_t needle_flag_comp = 0;//自动进样升级指令
uint8_t autoComplete = 0;//自动进样完成标志位
uint8_t auto_y_x_flag = 0;
uint8_t yao_y_flag = 0;
uint8_t yao_z_flag = 0;
/***********************************************************************************************
*函数名 :uart2_upper_tansmit
*函数功能描述 :下位串口发送操作
*函数参数 :
1.ptr 发送存储区
2.len发送长度
*函数返回值 :
*作者 :
*函数创建日期 :
*函数修改日期 :
*修改人 :
*修改原因 :
*版本 :
*历史版本 :1.0.0
***********************************************************************************************/
void uart2_upper_tansmit(uint8_t *ptr,uint8_t len)
{
uint8_t i;
for(i=0;i<len;i++)
{
USART_SendData(USART2, (uint8_t)(*(ptr+i)));
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
{}
}
}
void cmd_data_auto(uint8_t *ptr,uint8_t len)
{
uint8_t *str;
uint8_t i;
*str = HEAD_DATA_1;
*(str + 1) = HEAD_DATA_2;
*(str + 2) = HEAD_DATA_2;
*(str + 3) = len+6;
*(str + 4) = 0x01;
*(str + 5) = 0x40;
*(str + 6) = 0x71;
*(str + 7) = total_num++;
*(str + 8) = *ptr;//ID
*(str + 9) = *(ptr+1);//SUB_ID
for(i=0;i<len;i++)
*(str + 9+i) = *(ptr+2+i);
for(i=0;i<len+6;i++)
*(str+10+len) = *(str);
uart2_upper_tansmit(str,len+6);
}
/***********************************************************************************************
*函数名 :AutoDo
*函数功能描述 :下位串口数据处理操作
*函数参数 : type 处理命令
*函数返回值 :
*作者 :
*函数创建日期 :
*函数修改日期 :
*修改人 :
*修改原因 :
*版本 :
*历史版本 :1.0.0
***********************************************************************************************/
void AutoDo(uint8_t type)
{
// switch(type)
// {
// case 0x00://复位结果
// case 0x01://纵向进样组件
// case 0x02://横向进样组件
// case 0x03://卸载组件
// case 0x04://混匀组件
// case 0x05://混匀组件
// case 0x06://混匀组件
// report_data.data.len = 7;
// report_data.data.type = 0x03;
// report_data.data.source = AUTO_IN_SAMPLING_UINT;
// report_data.data.data_num = total_num++;
// report_data.data.object = 0x3F;
// report_data.report_type = autoBuf[INDEX_CMD_DATA_FIRST];
// report_data.report_sub_type = autoBuf[INDEX_CMD_DATA_FIRST+1];
// report_data.buf[0] = autoBuf[INDEX_CMD_DATA_FIRST + 2];
// report_report_upper(report_data);
// break;
// case 0x07://升级指令
// needle_flag_comp = autoBuf[INDEX_CMD_DATA_FIRST];
// if (needle_flag_comp)
// {
// report_data.data.len = 7;
// report_data.data.type = 0x03;
// report_data.data.source = AUTO_IN_SAMPLING_UINT;
// report_data.data.data_num = total_num++;
// report_data.data.object = 0x3F;
// report_data.report_type = 0x63;
// report_data.report_sub_type = 0x07;
// report_data.buf[0] = 0x01;
// report_report_upper(report_data);
// }
// break;
// case 0x08:
// if (RxBuf[INDEX_CMD_SUB_ID] == 0x00)
// autoComplete = RxBuf[INDEX_CMD_DATA_FIRST];
// break;
// case 0x0e:
// if (autoBuf[INDEX_CMD_DATA_FIRST] == 0)
// auto_y_x_flag = 1;
// else;//错误
//
// break;
// case 0x10:
//
// if (autoBuf[INDEX_CMD_DATA_FIRST] == 0)
// yao_y_flag = 1;
// else;//错误
// break;
// case 0x0F:
// if (autoBuf[INDEX_CMD_DATA_FIRST] == 0)
// yao_z_flag = 1;
// else;//错误
//
// break;
// }
}
/***********************************************************************************************
*函数名 :uart2_init
*函数功能描述 :下位串口初始化
*函数参数 :
*函数返回值 :
*作者 :
*函数创建日期 :
*函数修改日期 :
*修改人 :
*修改原因 :
*版本 :
*历史版本 :1.0.0
***********************************************************************************************/
void uart2_init(u32 bound)
{
uint8_t temp =0xaa;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
USART_DeInit(USART2); //复位串口1
//USART2_TX PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2
//USART2_RX PA.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA3
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
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(USART2, &USART_InitStructure); //初始化串口
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART2, ENABLE); //使能串口
uart2_upper_tansmit(&temp,1);
}
void USART2_IRQHandler(void) //串口1中断服务程序
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清楚中断标志位
if(revData.pin == revData.endBuffer) //确保队列不溢出
{
revData.pin = revData.startBuffer;
}
*(revData.pin++) =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
revData.mcount++;
}
else if(USART_GetITStatus(USART2, USART_IT_PE) != RESET)
{
DEBUG("USART2 USART_IT_PE ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_PE); //清楚中断标志位
}
else if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
DEBUG("USART2 USART_IT_TXE ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_TXE); //清楚中断标志位
}
else if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)
{
DEBUG("USART2 USART_IT_TC ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_TC); //清楚中断标志位
}
else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
DEBUG("USART2 USART_IT_IDLE ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_IDLE); //清楚中断标志位
}
else if(USART_GetITStatus(USART2, USART_IT_LBD) != RESET)
{
DEBUG("USART2 USART_IT_LBD ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_LBD); //清楚中断标志位
}
else if(USART_GetITStatus(USART2, USART_IT_CTS) != RESET)
{
DEBUG("USART2 USART_IT_CTS ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_CTS); //清楚中断标志位
}
else if(USART_GetITStatus(USART2, USART_IT_ERR) != RESET)
{
DEBUG("USART2 USART_IT_ERR ERROR!\n");
USART_ClearITPendingBit(USART2,USART_IT_ERR); //清楚中断标志位
}
else