switch_test/User/usart.c

1011 lines
28 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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**********************/