新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2018-3-13
- 在线时间
- 45 小时
|
20金钱
求助各位坛友!!!
我这边做了一个数据电台通信的代码,电路是电台和PC端的串口,还有电台和单片机的串口连接,电台通过串口发信息的时候(该信息就十个字节左右),信息会同时发送到PC端的串口助手和单片机里。测试的时候会有如下情况,PC端的串口助手都能接收到所有的信息说明电台是有发送的,就是单片机的串口有时候能收到,有时候收不到。我用的是STM32F103C8T6的串口2,请问这种情况会因为什么而造成的呢?硬件电路都没有问题,
串口代码如下:
char USART2_BUF[100]={0};//定义一个串口2的接收缓冲区
char USART2_NUM = 0;//串口2的缓冲数
/*
函数名称:串口2初始化函数
函数参数:波特率
函数返回值:无
函数备注:TX--PA2,RX--PA3
*/
void usart2_init(unsigned int bound){
GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO类型的结构体
USART_InitTypeDef USART_InitStructure;//定义一个usart类型的结构体
NVIC_InitTypeDef NVIC_InitStructure;//定义一个nvic类型的结构体
//打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开PA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//开串口2时钟
//TX--PA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //配置成复用输出功能
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
//RX--PA3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置成浮空输入功能
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
//USART2参数配置
USART_InitStructure.USART_BaudRate = bound;//设置波特率:bound
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_Mode = USART_Mode_Rx | USART_Mode_Tx;//开启接收和发送模式
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
USART_Init(USART2, &USART_InitStructure); //初始化串口2
//中断设置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断服务函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 1;//抢占优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断开启
NVIC_Init(&NVIC_InitStructure); //初始化
//开启USART2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接收中断
USART_Cmd(USART2, ENABLE);//串口
}
/*串口2接收中断服务函数*/
void USART2_IRQHandler(void)
{
if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)
{
USART2_BUF[USART2_NUM] = USART_ReceiveData(USART2);
USART2_NUM++;
if(USART2_NUM>98)
{
memset(USART2_BUF,0,sizeof(USART2_BUF));
USART2_NUM = 0;
}
}
}
|
|