串口发送字符正常,接收到的字符转发出来乱码

2019-10-15 17:44发布

本帖最后由 lsy3500 于 2017-1-10 15:33 编辑

如题,看原子哥的视频,用原子哥的代码,但是我调试就一直是乱码,不知道怎么回事,求助。附上我的代码和压缩包(其实主要还是原子哥的代码)~~~
附件是我的代码压缩包,恳请大大们帮我看看,谢谢。

程序结构:
main(){
    接收字符串:依靠中断接收字符并转发出来

    while(1){
         循环发送字符串:lsy
    }
}


[mw_shl_code=c,true]#include "stm32f10x.h"

//延时函数
void mydelay_ms(int ms) {  
  volatile int  i;  
  int k = ms * 2333 ;  
  for ( i=0; i<k; i++ ) {  
    ;
  }  
}  




//初始化函数
void LSY_USART1_Init(void)
{
  //三个相关结构体
  GPIO_InitTypeDef GPIO_InitStrue;
  USART_InitTypeDef USART_InitStrue;
  NVIC_InitTypeDef NVIC_InitStrue;
        
  //使能时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        
  //配置引脚(usart1)
  //GPIOA_Pin_9
  GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
  GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);
  //GPIOA_Pin_10
  GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
  GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);
        
        
  //串口参数配置
  USART_InitStrue.USART_BaudRate=9600;
  USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
  USART_InitStrue.USART_Parity=USART_Parity_No;
  USART_InitStrue.USART_StopBits=USART_StopBits_1;
  USART_InitStrue.USART_WordLength=USART_WordLength_8b;
        
        
  USART_Init(USART1,&USART_InitStrue);//串口初始化
  USART_Cmd(USART1,ENABLE);//使能串口1
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
        
  //中断参数配置
  NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
  NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
  NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
  NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
  NVIC_Init(&NVIC_InitStrue);
}


//中断处理函数:功能:转发接收到的字符串
void USART1_IRQHandler(void)
{
  u8 res;
  if(USART_GetITStatus(USART1,USART_IT_RXNE))
  {
  res= USART_ReceiveData(USART1);
  USART_SendData(USART1,res);   
  }
}

int main(void)
{        
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级配置
        
  LSY_USART1_Init();//调用初始化函数

        
  while(1){
      char buf[] = {"lsy"};
      char i = 0;
               
      USART_GetFlagStatus(USART1, USART_FLAG_TC);//解决串口发送首字母丢失的问题
      for (i=0; i<3; i++) {
          USART_SendData(USART1, buf);
          while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
      }
      USART_SendData(USART1, 0x0A); //" "
               
      mydelay_ms(3000);
  }
}
[/mw_shl_code]



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
22条回答
小小怪
2019-10-17 17:30
本帖最后由 小小怪 于 2017-1-10 20:10 编辑

之前学习寄存器版本,现在用库函数感觉很方便....
下面代码能实现,感觉中断转发不怎么可靠...楼主可以自己试一下多中断或多任务的情况下

[mw_shl_code=applescript,true]int main(void) {
        uint32_t del;

        GPIO_InitTypeDef uGPIO;
        USART_InitTypeDef uUSART;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);

        uGPIO.GPIO_Pin                = GPIO_Pin_9;
        uGPIO.GPIO_Mode                = GPIO_Mode_AF_PP;
        uGPIO.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &uGPIO);

        uGPIO.GPIO_Pin                = GPIO_Pin_10;
        uGPIO.GPIO_Mode                = GPIO_Mode_IN_FLOATING;
        uGPIO.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &uGPIO);

        USART_DeInit(USART1);
        /* USART_InitStruct members default value */
        uUSART.USART_BaudRate = 9600;
        uUSART.USART_WordLength = USART_WordLength_8b;
        uUSART.USART_StopBits = USART_StopBits_1;
        uUSART.USART_Parity = USART_Parity_No ;
        uUSART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        uUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
        USART_Init(USART1, &uUSART);

        NVIC_SetPriorityGrouping(2);
        NVIC_SetPendingIRQ(USART1_IRQn);
        NVIC_EnableIRQ(USART1_IRQn);
        NVIC_SetPriority(USART1_IRQn, 2);

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_Cmd(USART1, ENABLE);
        
        while(1) {
                del = 1000000;
                while(del--) {;}
        }
}

void USART1_IRQHandler(void) {
        uint8_t Res;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
                Res = USART_ReceiveData(USART1);
                USART1->DR = Res;
                //while((USART1->SR&0X40)==0);
                USART_ClearFlag(USART1, USART_FLAG_RXNE);
  }
}[/mw_shl_code]


一周热门 更多>