STM32 使用 USART2 接收到乱码:Hw?K]{n籌C靁丝亟塔Y祆璵n縣_
请问各位大神是什么问题啊?同样的代码,改成USART1就可以用。
重点代码如下:
void USART_Configuration()
{
USART_InitTypeDef USART_InitStruct;
USART_DeInit(USART2);
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART, &USART_InitStruct);
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_PinRemapConfig(GPIO_Remap_USART2, DISABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //TxD
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //RxD
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
RxBuffer[RxCounter++] = (USART_ReceiveData(USART2) & 0xFF);
if(RxCounter >= RxLimit) {
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}
}
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) {
USART_SendData(USART2, TxBuffer[TxCounter++]);
if(TxCounter >= TxLimit) {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
}
int main()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_Configuration();
USART_Configuration();
USART_Cmd(USART2, ENABLE);
}
------解决方案--------------------
时钟源的选择是否对了
------解决方案--------------------
USART2是不是被复用了
------解决方案--------------------
示波器判读一下信号就知道波特率设置对不对了。让Tx发送一个字节,把波形抓下来,看起始位到结束位的时间
------解决方案--------------------
一个可以一个不行,那就逐一找两个的差异吧,总能找出来的。
------解决方案--------------------
这会是什么问题?我也想知道
------解决方案--------------------
确实有问题。首先电平就不对,才3.6V,你需要RS232驱动芯片
波形也不对,这个真猜不出是怎么回事,配置不对?或者硬件坏了
------解决方案--------------------
我也碰到过这个问题,串口的波特率设置不对
USARTDIV = (float)(36*1000000)/(115200*16);//串口1是72,串口2是36(CPU的频率)
------解决方案--------------------
不是硬件,那还是配置问题。波形不光是脉冲宽度不对,中间还多出个脉冲来,不明白