以下为485通讯.c文件
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include "Delay.h"
#include <stdarg.h>
#include <Serial.h>
uint8_t Serial_RxPacket[8]; //8个字节
uint8_t Serial_RxFlag; //发送完成的标识符
void Serial_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //控制数据的接收、发送
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //485-TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //485-RX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位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); //初始化USART1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收中断使能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //分优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1, ENABLE);
RS485_receive(); //默认打开接收机
}
void Serial_SendByte(uint8_t Byte) //发送单个字节
{
RS485_send(); //开启发送模式,关闭接收模式
USART_SendData(USART1, Byte);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
Delay_ms(2);
RS485_receive(); //默认打开接收机
}
void Serial_SendArray(uint8_t *Array, uint16_t Length) //发送数组式字节
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Array[i]);
}
}
uint8_t Serial_GetRxFlag(void)
{
if (Serial_RxFlag == 1)
{
Serial_RxFlag = 0; //开始标识
return 1;
}
return 0;
}
uint8_t Sum_Check(uint8_t *buf, uint16_t len)
{
uint16_t i = 0;
uint8_t sum_temp = 0;
for (i = 0; i < len; i++)
{
sum_temp += buf[i];
}
return sum_temp;
}
void USART1_IRQHandler(void)
{
static uint8_t RxState = 0;
static uint8_t pRxPacket = 0;
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //接收数据
{
uint8_t RxData = USART_ReceiveData(USART1); //回传数据赋给RxData
if (RxState == 0)
{
if (RxData == 0xFF) //帧头判断
{
RxState = 1; //帧头无误标志位
pRxPacket = 0;
}
}
else if (RxState == 1)
{
Serial_RxPacket[pRxPacket] = RxData; //RxData分别赋给Serial_RxPacket[0]*Serial_RxPacket[3]
pRxPacket ++;
if (pRxPacket >= 6)
{
RxState = 2; //数据接收完毕标志位
}
}
else if (RxState == 2)
{
uint8_t sum;
sum = Sum_Check((u8*)Serial_RxPacket,6);
if (RxData == sum) //校验和验证
{
Serial_RxFlag = 1; //结束标识
Serial_SendArray(Serial_RxPacket,6);
}
if (RxData != sum) Serial_SendByte(0x00); //发送校验不通过字节
pRxPacket = 0; RxState = 0; //pRxPacket、RxState重新赋值方便下次接收数据
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
|