usart 串口的发送-接收数据(正点改编)

本文详细介绍了STM32微控制器中串口通信的基本实现原理及代码示例。包括USART初始化设置、中断处理程序、数据接收与发送过程等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:上位机发送给mcu,mcu原原本本发送给上位机

**main关键代码**
    while(1)
    {
        if(flag==1)
                {
                    len=usart_sta&0xffff;//接收数据长度,&0xffff 可以省略
                 for(t=0;t<len;t++)
                 {
                    Uart1_PutChar(usart_array[t]);
                 }
                    printf("\r\n");
                 flag=0;
                 usart_sta=0;
                } 
                else
                    times++;
            if(times%30==0)   LED0=!LED0;
            delay_ms(10); 
       }

 **usart.h关键代码**

 #define usart_len       10     //定义最大接收字节数
 extern u8  usart_array[usart_len]; //接收缓冲
 extern u8 usart_sta;               //接收n位的判断
 extern u8 flag;                //标志位

**usart.c关键代码**

u8 usart_array[usart_len];
u8 flag=0;
u8 usart_sta=0;

void Uart1_PutChar(u8 ch)
{

  USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

}
//USART_GetITStatus(USART1, USART_IT_RXNE) == SET

void USART1_IRQHandler(void)      //串口1中断服务程序,固定的函数名,在startup_stm32f10x_hd.s
    {
    u8 Res;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  //接收中断
        {
         Res=USART_ReceiveData(USART1); //读取接收到的数据
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//这个可有可无
         if(flag==0)//标志位
         {
           usart_array[usart_sta&0xffff]=Res;//按位存储,可以去掉&0xffff,加上方便理解
             usart_sta++;
             if(usart_sta>usart_len)//设置数据存放数据的上限
             {
                 usart_sta=0;
               printf("\r\n输入错误\r\n");
             }
             if(Res==0x0d)//判段是否收到回车键,回车键表示发送
             {
               flag=1;
             }
         }

      }
   }
USART设置步骤:
1.开启串口、GPIO时钟
2.串口引脚初始化(TX/RX)
3.NVIC配置(优先级/通道..)
4.USART初始化设置(波特率/字长/奇偶校验..)
5.开启串口的中断方式(TC/RXNE..)
6.使能串口
【7.中断处理函数】(函数名在startup_stm32f1010x_hd.s)

皇图霸业谈笑中,不胜今宵一场醉...
在使用USART串口调试工具时,如果遇到发送数据后无法接收的情况,可能涉及多个面的问题,包括硬件连接、配置参数、代码实现等。以下是可能的原因及对应的解决法: 1. **检查串口引脚配置是否正确** STM32的USART外设通常有多个引脚可供选择,但不同型号的芯片引脚复用功能可能不同。确保使用的是正确的引脚,并且已经正确配置为复用推挽输出模式。例如,在STM32F105中,USART3的默认引脚是PC10(TX)和PC11(RX)[^1]。 2. **检查波特率、数据位、停止位和校验位是否匹配** 串口通信的双必须使用相同的波特率、数据位、停止位和校验式。如果这些参数不一致,会导致接收端无法正确解析数据。建议使用标准波特率(如9600、115200)进行测试[^2]。 3. **确保USART接收中断或DMA已启用** 如果使用中断或DMA式进行接收,需要检查是否已正确配置并启用相应的中断或DMA通道。例如,在使用中断时,需调用`USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);` 并在NVIC中使能USART3中断[^1]。 4. **检查是否启用了USART接收功能** 在USART初始化过程中,必须启用接收功能。例如,在STM32标准外设库中,应调用`USART_Cmd(USART3, ENABLE);` 并确保`USART_ReceiveData()`函数被正确调用[^3]。 5. **验证串口回环测试(Loopback Test)** 为了排除硬件问题,可以将TX和RX引脚短接,进行回环测试。如果能够成功接收到自己发送的数据,则说明软件配置基本正确,问题可能出在外部设备或线路连接上[^2]。 6. **检查是否使用了正确的USART时钟源** STM32的USART模块依赖于系统时钟,确保在RCC配置中已经启用USART3的时钟。例如,调用`RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);`。 7. **检查串口调试助手设置是否正确** 有些串口调试助手在发送数据后不会自动清空接收缓冲区,导致后续数据被覆盖。确保调试助手的接收缓冲区设置为“追加”模式,并检查是否有数据被截断或丢失的情况。 8. **检查是否使用了正确的GPIO端口重映射** 如果使用的是重映射后的USART引脚(如USART3_REMAP),需要在GPIO配置中启用重映射功能。例如,调用`GPIO_PinRemapConfig(GPIO_USART3_REMAP, ENABLE);`[^1]。 9. **确保没有其他外设冲突** 在某些情况下,其他外设可能会占用相同的GPIO引脚或中断线,导致USART无法正常工作。检查所有外设的配置,确保没有冲突[^3]。 10. **检查电源和地线连接是否稳定** 不稳定的电源或不良的地线连接可能导致通信不稳定。使用万用表检查电压是否稳定,并确保地线连接良好[^2]。 ### 示例代码:USART3初始化(STM32F105) ```c void USART3_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置USART3 TX (PC10) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // 配置USART3 RX (PC11) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); // 配置USART USART_InitStructure.USART_BaudRate = 115200; 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(USART3, &USART_InitStructure); // 使能USART USART_Cmd(USART3, ENABLE); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值