|
本帖最后由 jason_lunt 于 2018-3-21 16:58 编辑
写了一个通过串口中断实现串口接收数据串,等接收完数据串后,将数据串通过串口输出。但是现在只能接收到第一个字节的数据,后面的数据丢失,不知道原因是什么,求各路大神指点迷津!!
源码如下,附件为工程文件
/**
******************************************************************************
* @file Project/STM32F10x_StdPeriph_Template/main.c
* @author MCD Application Team
* @version V3.5.0
* @date 08-April-2011
* @brief Main program body
******************************************************************************
* @attention
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>
#include "stdlib.h"
#include "bsp_tim.h"
#include "bsp_gpio.h"
#include "bsp_adc.h"
#include "bsp_modbus.h"
#include "misc.h"
//函数声明
void LED_GPIO_Configuration(void);
void USART1_Configuation(void);
void LED_Blink(void);
void TIM2_USART1_NVICInit(void);
void Timer2_Init(void);
float Real_AdcValue;
//外部变量声明
extern uint16_t ADC_ConvertedValue;
u8 FLAG_EOC_ADC = 0;
u8 data_buff[2];
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到USART1 */
USART_SendData(USART1, (unsigned char) ch);
/* 等待发送完毕 */
while (!(USART1->SR & USART_FLAG_TXE));
// while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
return (ch);
}
///重定向c库函数scanf到USART1
int fgetc(FILE *f)
{
/* 等待串口1输入数据 */
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART1);
}
//=============================================================================
//文件名称:Delay
//功能概要:延时
//参数说明:nCount:延时长短
//函数返回:无
//=============================================================================
/***********
void Delay(uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
***********************/
//=============================================================================
//文件名称:main
//功能概要:主函数
//参数说明:无
//函数返回:无
//=============================================================================
int main(void)
{
u16 j = 0;
Modbus_Init();
TIM2_USART1_NVICInit();
LED_GPIO_Configuration();
USART1_Configuation();
Timer2_Init();
printf("the SystemCoreClock is %d\r\n",SystemCoreClock);
// printf("this is a adc test printf demo\r\n");
while (1)
{
//LED_Blink();
if (Modbus.ReceiveFlag == 1)
{
for (j = 0; j < Modbus.ReceiveCnt; ++j)
{
USART_SendData (USART1, Modbus.ReceiveBuff[j]);
while (USART_GetITStatus (USART1, USART_FLAG_TC) == RESET);
}
Modbus.ReceiveCnt = 0;
Modbus.ReceiveFlag = 0;
}
}
}
//=============================================================================
//文件名称:LED_GPIO_Configuration
//功能概要:GPIO初始化
//参数说明:无
//函数返回:无
//=============================================================================
void LED_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
//=============================================================================
//LED -> PC13
//=============================================================================
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/* bsp_usart-------------------------------------------------------------*/
//定义函数对串口进行初始化
//1使能串口时钟和对应的I/O钟 2 配置串口的I/O
//3配置串口的工作模式 波特率 115200、数据位8位、奇偶校验位0、停止位1位、无硬件流控制
void USART1_Configuation(void)
{
GPIO_InitTypeDef GPIO_InitSturcture;
USART_InitTypeDef USART_InitStructure;
//开启时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1|
RCC_APB2Periph_GPIOA,ENABLE);
//配置串口I/O
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_9;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitSturcture);
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_10;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init (GPIOA ,&GPIO_InitSturcture);
//3配置串口的工作模式 波特率 115200、数据位8位、奇偶校验位0、停止位1位、无硬件流控制
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_ITConfig ( USART1, USART_IT_RXNE, ENABLE);
USART_Init (USART1, &USART_InitStructure);
//串口使能
USART_Cmd (USART1,ENABLE);
}
void LED_Blink(void)
{
PBout(5)=1;
// printf("the led is off\r\n");
// Delay_us (2000);
delay_ms(1000);
PBout(5)=0;
// printf("the led is on \r\n");
// Delay_us(2000);
delay_ms(1000);
}
void USART1_IRQHandler(void)
{
u8 sbuff;
if ( USART_GetITStatus (USART1, USART_IT_RXNE) !=RESET)
{
sbuff = USART_ReceiveData ( USART1);
if (Modbus.ReceiveFlag == 1)
{
return;
}
Modbus.ReceiveBuff[Modbus.ReceiveCnt++] = sbuff;
Modbus.TimeOut = 0;
if (PBin (5)==0)
{
PBout(5)=1;
}
else
PBout (5)=0;
if (Modbus.ReceiveCnt == 1)
{
Modbus.TimeRun = 1;
}
}
}
void TIM2_USART1_NVICInit(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1);//a bbb
NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (&NVIC_InitStructure);
//串口1中断配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init (&NVIC_InitStructure);
}
void TIM2_IRQHandler()
{
if (TIM_GetITStatus (TIM2, TIM_IT_Update))
{
if (Modbus.TimeRun != 0)
{
Modbus.TimeOut++;
if (Modbus.TimeOut >8)
{
Modbus.TimeRun = 0;
Modbus.ReceiveFlag =1;
}
}
TIM_ClearFlag (TIM2, TIM_FLAG_Update);
}
}
void Timer2_Init(void)
{
TIM_TimeBaseInitTypeDef tim_InitStructure;
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2, ENABLE);
TIM_DeInit (TIM2);
tim_InitStructure.TIM_Period =1000-1;
tim_InitStructure.TIM_Prescaler = 72-1;
tim_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
tim_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit (TIM2, &tim_InitStructure);
TIM_ITConfig (TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd ( TIM2, ENABLE);
}
/* end -- -----------------------------------------------------------*/
|
|