使用STM32F051的串口2调试模块, MCU只接收到第一位数据,后面的7位数据都接收不到,请问改如何解决?
描述:
1、我使用串口调试助手测试MCU的程序,用MCU发送指令0xF5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xF5
然后用助手发送正确的返回指令0xF5,0x0D, 0x00, 0x01, 0x00, 0x00, 0x0C, 0xF5
程序完全没有问题,全部都能接收能发送,并且我发错误指令时程序也能判断出错误,但是我连接上模块时,
程序出错了,程序一进接收中断就跑死,后来看了网上的大神解析改正过来,现在进入接收中断不会死了,但是又出现了新的问题
2、程序只能接收第一个数据 0XF5 后面的7位都不能接收,直接就接收超时了(我程序设定了1Sec 接收超时报警),我仿真了下,看到只能接收到一个数据
但是我用串口线把MCU的数据发送和模块的数据反馈打印到串口调试助手,发现,命令是正确的,模块也识别命令了,返回了正确的答复数据,说明指令的发送是没有错误的,是我程序的问题,但是我非常奇怪用串口调试助手调试时程序没有问题,连上模块就只能接收到第一个数据了。
串口初始化和中断接收的程序如下:
串口2初始化
[mw_shl_code=c,true]void USART2_Init(void)//串口2初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
/*
* USART2_TX -> PA2 , USART2_RX -> PA3
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 57600;//设置串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART2, &USART_InitStructure); //配置入结构体
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART2, ENABLE);//使能串口2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);[/mw_shl_code]
[mw_shl_code=c,true]
//下面这两句是网上大神说要这样添加的
USART_ITConfig(USART2, USART_IT_PE, ENABLE);
USART_ITConfig(USART2, USART_IT_ERR, ENABLE);
}[/mw_shl_code]
串口中断
[mw_shl_code=c,true]void USART2_IRQHandler(void)
{
uint8_t Clear_ch = 0; //读一下寄存器,实际没有用到
if(USART_GetITStatus(USART2, USART_IT_TXE) == SET) //发送
{
USART_SendData(USART2, send_num[a++]);
Delay_ms(10);
if(a == 8)
{
a = 0;
b = 0;
Flag = 0;
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) //接收
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
rec_num[b++]=USART_ReceiveData(USART2);
Flag = 1;
}
//下面这部分是看了网上的大神说这样添加的,添加后进入接收中断就没有跑死了
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR
Clear_ch = USART_ReceiveData(USART2); //读DR
Flag = 1;
}
if(USART_GetFlagStatus(USART2, USART_FLAG_NE) == SET)
{
USART_ClearFlag(USART2, USART_FLAG_NE);
Flag = 1;
}
if(USART_GetFlagStatus(USART2, USART_FLAG_FE) == SET)
{
USART_ClearFlag(USART2, USART_FLAG_FE);
Flag = 1;
}
if(USART_GetFlagStatus(USART2, USART_FLAG_PE) == SET)
{
USART_ClearFlag(USART2, USART_FLAG_PE);
Flag = 1;
}
Clear_ch = Clear_ch+0;
}[/mw_shl_code]
现在这个程序
[mw_shl_code=c,true]rec_num[]缓存中只有rec_num[0]接收到0XF5,后面的7位接收不到了。[/mw_shl_code]
[mw_shl_code=c,true]运行平台如下:[/mw_shl_code]
[mw_shl_code=c,true]STM32F051C8T6 内部8MHz晶振 系统时钟48MHz 通信波特率 57600[/mw_shl_code]
[mw_shl_code=c,true]再说一下问题吧,MCU与串口调试助手对发与接收时,程序没有问题 。MCU与模块发送接收时MCU只能接收第一位数据,后面的7位接收不到,为什么?请大神帮帮忙。[/mw_shl_code] |