本帖最后由 wenqiangjames 于 2015-3-4 15:46 编辑
试验内容:串口中断收发,STM32 接收字符,以十进制输出输入的值
问题现象:1、原测试程序波特率115200,串口调试助手发送“1”,回收“49”,此为正确现象
2、波特率修改为9600,串口调试助手发送“1”,回收却变成“149”,异常了,多了个1
3、在中断中取出输出的printf,上位机还是能收到“1”
总结问题:STM32接收到数据后,自己返回接收的数据(并不是我所期望的),请大神们帮忙,谢谢!!!
</p><p>//头文件调用
#include "usually.h"
#include "usart.h"
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int Data, FILE *f)
{
while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
//USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
USART_SendData(USART1,Data); //发送一个字符
return Data; //返回一个值
}
#endif
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: USART1_Send_Byte
** 功能描述: 串口发送一个字符串
** 参数描述:Data 要发送的数据
** 作 者: Dream
** 日 期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void USART1_Send_Byte(uint16_t Data)
{
while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
//USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
USART_SendData(USART1,Data); //发送一个字符
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: USART1_Send_Byte
** 功能描述: 串口发送一个字符串
** 参数描述:Data 要发送的数据
** 作 者: Dream
** 日 期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
uint8_t USART1_Receive_Byte(void)
{
while(!(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))); //USART_GetFlagStatus:得到接收状态位
//USART_FLAG_RXNE:接收数据寄存器非空标志位
//1:忙状态 0:空闲(没收到数据,等待。。。)
return USART_ReceiveData(USART1); //接收一个字符
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Usart_Init
** 功能描述: 串口引脚初始化
** 参数描述: 无
** 作 者: Dream
** 日 期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Init_Usart(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
//使能各个端口时钟,重要!!!
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //配置串口接收端口挂接到9端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能输出开漏
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置端口速度为50M
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化GPIOA寄存器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入(复位状态);
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化GPIOA寄存器
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Usart_Configuration
** 功能描述: 串口配置函数
** 参数描述: BaudRate设置波特率
** 作 者: Dream
** 日 期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Usart_Configuration(uint32_t BaudRate)
{
USART_InitTypeDef USART_InitStructure; //定义一个串口结构体
USART_InitStructure.USART_BaudRate =BaudRate ; //波特率115200
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); //根据参数初始化串口寄存器
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口中断接收
USART_Cmd(USART1, ENABLE); //使能串口外设
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: USART1_IRQHandler
** 功能描述: 串口中断函数
** 参数描述: 无
** 作 者: Dream
** 日 期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void USART1_IRQHandler()
{
uint8_t ReceiveDate; //定义一个变量存放接收的数据
if(!(USART_GetITStatus(USART1,USART_IT_RXNE))); //读取接收中断标志位USART_IT_RXNE
//USART_FLAG_RXNE:接收数据寄存器非空标志位
//1:忙状态 0:空闲(没收到数据,等待。。。)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清楚中断标志位
ReceiveDate=USART_ReceiveData(USART1); //接收字符存入数组
printf("%d",(char*)ReceiveDate); //以十进制输出输入的值,从这里我们可以看到键盘上所有的键值对应的十进制数
//比如输入"1"对应的输出49 、 输入"A" 对应的值为65
printf("\n\rT"); //换行置顶
}
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
End:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
</p>
|