#include "basic.h" /** * @brief DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1 ,中断接收模式 * @param 无 * @retval 无 */ //串口1中断初始化 static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; /* 抢断优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /* 子优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } //串口1初始化 void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); /* 使能 USART 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* GPIO初始化 */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* 配置Tx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 配置Rx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 连接 PXx 到 USARTx_Tx*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); /* 连接 PXx 到 USARTx__Rx*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); /* 配置串DEBUG_USART 模式 */ /* 波特率设置:DEBUG_USART_BAUDRATE */ USART_InitStructure.USART_BaudRate = 115200; /* 字长(数据位+校验位):8 */ USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 停止位:1个停止位 */ USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 校验位选择:不使用校验 */ USART_InitStructure.USART_Parity = USART_Parity_No; /* 硬件流控制:不使用硬件流 */ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* USART模式控制:同时使能接收和发送 */ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 完成USART初始化配置 */ USART_Init(USART1, &USART_InitStructure); //配置串口接收中断 NVIC_Configuration(); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能串口中断 //USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//使能串口空闲中断 /* 使能串口 */ USART_Cmd(USART1, ENABLE); } //串口3RS485中断初始化 static void RS485_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; /* 抢断优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } #define UART_RX_LEN 10 volatile uint16_t com3_rx_len = 0; //接收帧数据的长度 volatile uint8_t com3_recv_end_flag = 0;//帧数据接收完成标志 uint8_t com3_rx_buffer[10]={0}; //接收数据缓存 uint8_t UART_Receive_flg; uint8_t UART_Receive_len; void RS485_DMA_Init() { DMA_InitTypeDef DMA_InitStructure; /** * 使用DMA1、数据流1、通道4 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // DMA_DeInit(DMA1_Stream1); while (DMA_GetCmdStatus(DMA1_Stream1) != DISABLE); //等待DMA可配置 //通道0 DMA_InitStructure.DMA_Channel = DMA_Channel_4; //外设到内存 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //数据量 DMA_InitStructure.DMA_BufferSize = UART_RX_LEN ;// 3*2 //循环模式 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //优先级为中 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //外设地址 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR;////((uint32_t)0x40012308)((u32)ADC1+0x4c); //指针不递增 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设数据大小 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位 //单次突发 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //内存地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)com3_rx_buffer; //指针递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器数据大小 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//存储器数据长度:8位 //单次突发 DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //禁止FIFO模式 参数可不配置 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //由于禁止FIFO模式 参数可不配置 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //初始化DMA DMA_Init(DMA1_Stream1, &DMA_InitStructure); //使能DMA2 Stream0 DMA_Cmd(DMA1_Stream1,ENABLE); //DMA_ITConfig(DMA1_Stream1,DMA_IT_TC,ENABLE); } //串口3RS485初始化 void RS485_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); /* 使能 USART3 时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* GPIO初始化 */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* 配置Tx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 配置Rx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 配置485使能引脚 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE, GPIO_Pin_15); /* 连接 PXx 到 USARTx_Tx*/ GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART1); /* 连接 PXx 到 USARTx__Rx*/ GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART1); /* 配置串DEBUG_USART 模式 */ /* 波特率设置:DEBUG_USART_BAUDRATE */ USART_InitStructure.USART_BaudRate = 9600; /* 字长(数据位+校验位):8 */ USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 停止位:1个停止位 */ USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 校验位选择:不使用校验 */ USART_InitStructure.USART_Parity = USART_Parity_No; /* 硬件流控制:不使用硬件流 */ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* USART模式控制:同时使能接收和发送 */ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 完成USART初始化配置 */ USART_Init(USART3, &USART_InitStructure); //配置串口接收中断 RS485_NVIC_Configuration(); //USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//使能串口中断 USART_ITConfig(USART3,USART_IT_IDLE,ENABLE); //开启总线空闲中断 USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE); //使能串口3的DMA接收 /* 使能串口 */ USART_Cmd(USART3, ENABLE); RS485_RECEIVE;//默认进入接收模式 } void DealWith_UartData() { DMA_Cmd(DMA1_Stream1, DISABLE); UART_Receive_flg = 1; UART_Receive_len = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Stream1); com3_rx_buffer[UART_Receive_len] = 0; DMA_SetCurrDataCounter(DMA1_Stream1,UART_RX_LEN); DMA_ClearFlag(DMA1_Stream1, DMA_FLAG_TCIF2); DMA_Cmd(DMA1_Stream1, ENABLE); } /***************** 发送一个字符 **********************/ void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) { /* 发送一个字节数据到USART */ USART_SendData(pUSARTx,ch); /* 等待发送数据寄存器为空 */ while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } /***************** 发送字符串 **********************/ void Usart_SendString( USART_TypeDef * pUSARTx, char *str) { unsigned int k=0; do { Usart_SendByte( pUSARTx, *(str + k) ); k++; } while(*(str + k)!='\0'); /* 等待发送完成 */ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) {} } /***************** 发送一个16位数 **********************/ void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch) { uint8_t temp_h, temp_l; /* 取出高八位 */ temp_h = (ch&0XFF00)>>8; /* 取出低八位 */ temp_l = ch&0XFF; /* 发送高八位 */ USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); /* 发送低八位 */ USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } ///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); } ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { /* 等待串口输入数据 */ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1); } //串口3的发送函数 void Uart3_SendStr(u8* SendBuf,u8 len) { // u8 t; RS485_SEND;//执行发数据是将其置位,485处于可以发送状态 while(len>0) { while((USART3->SR&0X40)==0);//等待发送完成 USART3->DR = (u8) *SendBuf; SendBuf++; len--; } while((USART3->SR&0X40)==0); //这个循环一定要有,确保最后一位数据发送出去,避免因为复位导致数据未全部发送,我就在这个地方找了好久 RS485_RECEIVE; //数据发送完毕将其复位,等待接收数据 } void usart_Init() { NVIC_Configuration(); USART1_Config(); RS485_NVIC_Configuration(); RS485_Config(); RS485_DMA_Init(); } #define HD_VER 0001 //硬件版本 #define SW_VER 0001 //软件版本 #define TTL_SEND_BUFF_LEN 60 //发送数据长度 #define TTL_RECEIVE_BUFF_LEN 60 //接收数据长度 //---------------------------------------------------------------- //uart1用于接收usb转ttl的串口 //---------------------------------------------------------------- //存放发送的数据内容 unsigned char send_data[50]; unsigned char time_data[60]; unsigned char Fre_data[4]; //发送buff unsigned char ttl_send_len = 0; unsigned char ttl_send_buff[TTL_SEND_BUFF_LEN] = {0}; //接收buff unsigned char ttl_receive_len = 0; unsigned char ttl_receive_buff[TTL_RECEIVE_BUFF_LEN] = {0}; //接收超时 unsigned char ttl_receive_flag = 0; unsigned char ttl_receive_cnt = 0; unsigned char ttl_receive_interval = 0; unsigned char send_flag = 0; //发送标志 #define DATA_LEN TTL_RECEIVE_BUFF_LEN //一般数据长度 #define UART_ORDER_SOF 0x05 //起始字 #define UART_ORDER_END 0x1B //结束字 #define FIXED_LEN 0x0B //固定长度 //取消RW unsigned short SUR_DEVICE_ADDR = 0x00A1; //PC //0x00A1; //设备 unsigned short OBJ_DEVICE_ADDR = 0x00B1; //主板 //0x00B1; //PC群发 FFFF 0000 unsigned char get_time_flag = 0; unsigned char order_flag = 0; unsigned int checksum = 0, re_status = 0, rec_len = 0, data_len = 0, shouldaccept = 0; char Rate_dis = 0; //额定距离:0-1mm 1-2mm 2-3mm 3-4mm char Motor_Run = 0; //0 停止 1 运行 2 运行到起始点 3 运行到结束点 char Run_State = 0; //0 停止 1 运行 char Run_Mode = 0; //0 手动 1 自动 char Run_Dir = 0; //0 正转 1 反转 unsigned int Run_Step = 0; //电机运行步长 unsigned int Run_Inter = 0; //电机运行间隔时长 unsigned int Set_Vol = 820; //设定电压 unsigned int Motor_Fre = 0; //转动频率 unsigned int Mode_Flag = 1; //模式标志 unsigned int Speed = 0; //转速 unsigned int Set_dis = 0; //距离值 float dis = 0; //单独发送 void UART1_SendData(unsigned char dat) { USART_SendData(USART1,dat); } //发送数据 void UART1_Send_Char(unsigned char dat) { USART_SendData(USART1,dat); } //初始化 void InitUart_Data(void) { //EXTI_CTRL(1); order_flag = 0; rec_len = 0; re_status = 0; shouldaccept = 0; ttl_receive_flag = 0; ttl_receive_cnt = 0; checksum = 0; for(data_len = 0; data_len < DATA_LEN; data_len++) { ttl_receive_buff[data_len] = 0; } data_len = 0; // UART_Send_Char(0xdd); } /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ //---------------------------------------------------------------- //接收串口1 //---------------------------------------------------------------- /**************************************************************************************************** * @brief Download a file via serial port * @param None * @retval None **************************************************************************************************/ void start_ttl_receive_timer(unsigned long ms) { if(ms == 0) { return; } ttl_receive_flag = 1; ttl_receive_cnt = 0; ttl_receive_interval = ms; } /**************************************************************************************************** * @brief Upload a file via serial port. * @param None * @retval None **************************************************************************************************/ void over_ttl_receive_timer(void) { ttl_receive_flag = 0; ttl_receive_cnt = 0; ttl_receive_interval = 0; InitUart_Data(); // UART2_Send_Char(0xed); } /**************************************************************************************************** * @brief Display the Main Menu on HyperTerminal * @param None * @retval None **************************************************************************************************/ void clear_ttl_receive_timer(void) { uint16_t i = 0; ttl_receive_len = 0; ttl_receive_flag = 0; ttl_receive_cnt = 0; ttl_receive_interval = 0; for(i = 0; i < TTL_RECEIVE_BUFF_LEN; i++) { ttl_receive_buff[i] = 0; } } //返回串口屏应答是否接收完成的结果 //0:没超时 1:超时 unsigned char judge_ttl_receive_timer(void) { if(ttl_receive_flag == 2) { return 1; } else { return 0; } } /**************************************************************************************************** * @brief Display the Main Menu on HyperTerminal * @param None * @retval None **************************************************************************************************/ //放在大循环中的计时器里 void process_ttl_receive_timer(void) { if(ttl_receive_flag == 1) { ttl_receive_cnt++; } if((ttl_receive_interval > 0) && (ttl_receive_cnt >= ttl_receive_interval)) { over_ttl_receive_timer(); } } #define TTL_OVER_TIME 10 /**************************************************************************************************** * @brief Display the Main Menu on HyperTerminal * @param None * @retval None **************************************************************************************************/ //放串口中断内,接收数据 void receive_ttl_data(unsigned char rx_data) { //不能超过数组的最大长度 if(ttl_receive_len < TTL_RECEIVE_BUFF_LEN) { //开始计时 start_ttl_receive_timer(TTL_OVER_TIME); //串口接收数据分析 Do_Receive_Uart_For_Module(rx_data); } else //超过上限则抛弃后面的数据 { //超时处理 over_ttl_receive_timer(); InitUart_Data(); //UART_Send_Char(0xcc); } } #define CRC_PRESET 0xFFFF #define CRC_POLYNOM 0x4204 /*--------------------------------------------------------------------------- 调用方式:unsigned int ModbusCRC16(unsigned char *data_value, unsigned char length) 函数说明:CRC校验 ---------------------------------------------------------------------------*/ unsigned int ModbusCRC16(unsigned char *data_value, unsigned char length) { unsigned int crc_value = CRC_PRESET; unsigned char i; data_value++; while(length-- != 0) {//ModbusCRC16(PData, Num + FIXED_LEN - 3); for(i = 0x01; i != 0; i <<= 1) { if((crc_value & 0x0001) != 0) { crc_value >>= 1; crc_value ^= CRC_POLYNOM; } else { crc_value >>= 1; } if((*data_value & i) != 0) { crc_value ^= CRC_POLYNOM; } } data_value++; } return(crc_value); } //发送延时 void Uart_Send_Delay(unsigned int delay) { unsigned int i = 0, j = 0; for(i = 0; i < delay; i++) { for(j = 0; j < 125; j++); } } //校验 + 0X1B #define VERFIY_TYPE 0 /* SOF: 1个字节 0x05 起始字节 Len: 2个字节 长度 Fou_adr: 2个字节 源地址 Com_adr: 2个字节 目标地址,0ff为广播地址 Cmd16: 2个字节 命令字 Request-data: N字节 数据 XOR: 2个字节 校验 END: 0x1B 结束字节 */ //发送数据 void send_set_resp(unsigned int OrderNum, unsigned int addr, unsigned char Num, unsigned char sData[]) { unsigned int xor_data = 0; unsigned char PData[TTL_SEND_BUFF_LEN]; unsigned char i = 0; PData[0] = UART_ORDER_SOF; //第一个字节 PData[1] = (Num + FIXED_LEN) / 0x100; //长度 高8位 PData[2] = (Num + FIXED_LEN) % 0x100; //长度 低8位 PData[3] = (addr >> 8) & 0xff; //源地址 PData[4] = addr & 0xff; //源地址 PData[5] = (SUR_DEVICE_ADDR >> 8) & 0xff; //目标地址 PData[6] = SUR_DEVICE_ADDR & 0xff; //目标地址 PData[7] = (OrderNum >> 8) & 0xff; //命令字 -1 PData[8] = OrderNum & 0xff; //命令字 -2 // PData[6] = RW_Flag; //读写标志 for(i = 0; i < Num; i++) //发送数据 { PData[FIXED_LEN - 2 + i] = sData[i]; //数据 } //校验 xor_data = ModbusCRC16(PData, Num + FIXED_LEN - 3); PData[FIXED_LEN + Num - 2] = (xor_data) & 0xff; PData[FIXED_LEN + Num - 1] = (xor_data >> 8) & 0xff; PData[FIXED_LEN + Num] = UART_ORDER_END; // 末尾字节 //全部发送 for(i = 0; i < (Num + FIXED_LEN + 1); i++) //一次性发送所有数据 { UART1_Send_Char(PData[i]); //增加延时 Uart_Send_Delay(50); } } //分析地址是否为本地址 unsigned char Check_Resive_Addr(unsigned short addr) { //确定是否为接收地址 if((OBJ_DEVICE_ADDR == addr) || (0xFFFF == addr) || (0x0000 == addr) || (0x00B1 == addr)) { return 1; } else { InitUart_Data(); //2清数据 return 0; } } //接收数据判断(放置串口接收数据内) void Do_Receive_Uart_For_Module(unsigned char ch) { switch(re_status) { case 0 : //0x05 1字节 起始字 { if(ch == UART_ORDER_SOF) { EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断 //EXTI_CTRL(0); rec_len = 0; ttl_receive_buff[rec_len] = ch; re_status = 1; shouldaccept = 0; // UART2_Send_Char(0xaa); } } break; case 1: //长度 2字节 { rec_len++; ttl_receive_buff[rec_len] = ch; if(rec_len >= 2) { re_status = 2; shouldaccept = ttl_receive_buff[1] * 0x100 + ttl_receive_buff[2]; if(shouldaccept >= TTL_RECEIVE_BUFF_LEN - 1) { InitUart_Data(); return; } } } break; case 2: //命令字 2个字节 05 00 0B 00 C1 00 A1 F0 01 87 1B { rec_len++; if(rec_len >= TTL_RECEIVE_BUFF_LEN - 1) { InitUart_Data(); return; } ttl_receive_buff[rec_len] = ch; //接收 if(rec_len >= shouldaccept) //判断是否接收完成 { int adr = ttl_receive_buff[5]; adr = adr << 8; adr |= ttl_receive_buff[6]; if(Check_Resive_Addr(adr)) { //命令字 unsigned int order = 0; order = ttl_receive_buff[7]; order = order << 8; order += ttl_receive_buff[8]; switch(order) { //=================== =================================================== //设备接收数据 //====================================================================== case 0xF001 : //位移模式 { order_flag = 1; } break; case 0xF002 : //时间测试 { order_flag = 2; } break; //====================================================================== //设备信息 //====================================================================== case 0xF003 : //频率测试 { order_flag = 3; // UART2_Send_Char(0x33); } break; //====================================================================== //设备信息 //====================================================================== case 0xF004 : //置零 { order_flag = 4; } break; case 0xF005 : //安全栅开关 { order_flag = 5; } break; //====================================================================== // //====================================================================== default : { InitUart_Data(); } break; } } else { InitUart_Data(); return; } } } break; default : InitUart_Data(); break; } } //数据长度 unsigned char Get_Data_Len(void) { uint16_t Re_Len = 0; Re_Len = (ttl_receive_buff[1] * 0x100 + ttl_receive_buff[2]) - FIXED_LEN; return Re_Len; } //检查校验 unsigned char Check_VerfiyData(void) { // return 1; //调试期间,不用验证 // unsigned int CRC16 = 0; // unsigned int Get_CRC16 = 0; // CRC16 = ttl_receive_buff[shouldaccept]; // CRC16 = CRC16 << 8; // CRC16 += ttl_receive_buff[shouldaccept - 1]; // Get_CRC16 = ModbusCRC16(ttl_receive_buff, shouldaccept - 2); // if(CRC16 == Get_CRC16) //数据的完整性 // { // } // else // { // InitUart_Data(); // return 0; // } // return 1; } //数据接收分析(放置大循环内) void Deal_Uart_Data_For_Module(void) { if(order_flag) //有接收的指令 { //校验 if(Check_VerfiyData() == 1) //测试 { switch(order_flag) { //-------------------------------------------------------------------- // //-------------------------------------------------------------------- case 1 : //数据解析 { GPIO_SetBits(GPIOF,GPIO_Pin_11); zero_flag = 2; //停止置零 uint8_t i = 0; //临时变量 uint8_t len = 0; //长度 uint8_t temp[DATA_LEN]; //发送标志 send_flag = 0; //数据长度 len = Get_Data_Len(); //解析数据 for(i = 0; i < len; i++) { temp[i] = ttl_receive_buff[i + FIXED_LEN - 2]; } //角行程 、直行程 // Travle_Flag = temp[0]; //0 直 1 角 Motor_Run = temp[0]; //0 停止 1 运行 2 运行到近点 3 运行到远点 Run_Mode = temp[1]; //0 点动 1 自动 2 回差 3 重复十次 Run_Dir = temp[2]; //0 正转 1 反转 Run_Step = temp[3]; //电机运行多少圈为一个步长 Run_Step <<= 8; Run_Step += temp[4]; Run_Inter = temp[5]; //电机运行间隔时长 Run_Inter <<= 8; Run_Inter += temp[6]; Set_Vol = temp[7]; //设定电压值 Set_Vol <<= 8; Set_Vol += temp[8]; Mode_Flag = 1; //切换到模式1 EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断 //EXTI_CTRL(0); //ClrRunmotorStep();//清除电机标记 } break; case 2 : // { zero_flag = 2; //停止置零 Set_dis = ttl_receive_buff[FIXED_LEN - 2]; //距离值 dis = (float)Set_dis / 100.00f; get_time_flag = 1; //时间测试开始标志 Mode_Flag = 2; //切换到模式2 EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断 //EXTI_CTRL(0); } break; //-------------------------------------------------------------------- //LED 控制 //-------------------------------------------------------------------- case 3 : //F111 05 00 0C 00 A1 00 C1 F1 01 05 03 50 87 1B { GPIO_SetBits(GPIOF,GPIO_Pin_11); zero_flag = 2; //停止置零 //EXTI_CTRL(1); EXTI->IMR |= EXTI_Line6; //开启指定的外部中断 Run_State = ttl_receive_buff[FIXED_LEN - 2]; //0 停止 1 运行 //电机转动速度 if(ttl_receive_buff[FIXED_LEN - 1] <= 0x64) Speed = (110 + 80 * ttl_receive_buff[FIXED_LEN - 1]/100);// else Speed = 190; Mode_Flag = 3; //切换到模式3 } break; //====================================================================== // //====================================================================== case 4 : // { GPIO_SetBits(GPIOF,GPIO_Pin_11); zero_flag = 0; //开启置零 Rate_dis = ttl_receive_buff[FIXED_LEN - 2]; //额定距离值 Mode_Flag = 1; //切换到模式1 EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断 //EXTI_CTRL(0); } break; //-------------------------------------------------------------------- //实时信息 //-------------------------------------------------------------------- case 5 : // { Mode_turn = ttl_receive_buff[FIXED_LEN - 2]; //切换标志 if(Mode_turn == 0) { GPIO_ResetBits(GPIOE,GPIO_Pin_14 | GPIO_Pin_13);//电流模式 } else { GPIO_SetBits(GPIOE,GPIO_Pin_14 | GPIO_Pin_13);//安全栅模式 } } break; case 6 : // 设置 地址 + 版本号 F1D3 05 00 0D 00 A1 00 00 F1 D3 00 C1 07 A9 1B { } break; case 7 : //更新程序 { } break; //-------------------------------------------------------------------- //设备信息 //-------------------------------------------------------------------- case 10 : //F115 05 00 0A 00 C1 00 A1 F1 05 50 87 1B { } break; default : { } break; } } //清空数据 InitUart_Data(); } } /*********************************************END OF FILE**********************/