OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3753|回复: 10

烦请大神帮我看下代码哪里有问题,关于串口不使用中断的代码如下:

[复制链接]

9

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2018-8-8
在线时间
50 小时
发表于 2018-8-8 23:59:23 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 走投无路的卡卡 于 2018-8-9 09:34 编辑

#include "sys.h"
#include "delay.h"

#define LEIGHT 200

u8  USART_RX_BUF[LEIGHT];
u16 USART_RX_STA=0;                 
UART_HandleTypeDef UART1_Handler;
u8 aRxBuffer[1];

void usart1_init(u32 bound)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
   
   
    UART1_Handler.Instance=USART1;
    UART1_Handler.Init.BaudRate=bound;
    UART1_Handler.Init.Mode=UART_MODE_TX_RX;
    UART1_Handler.Init.WordLength=8;
    UART1_Handler.Init.StopBits=1;
    UART1_Handler.Init.Parity=UART_PARITY_NONE;
    UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
    HAL_UART_Init(&UART1_Handler);
   
    GPIO_InitTypeDef GPIO_Init;
   
    GPIO_Init.Pin=GPIO_PIN_9|GPIO_PIN_10;
    GPIO_Init.Mode=GPIO_MODE_AF_PP;
    GPIO_Init.Pull=GPIO_PULLUP;
    GPIO_Init.Speed=GPIO_SPEED_FAST;
    GPIO_Init.Alternate=GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA,&GPIO_Init);
}



int main(void)
{
    HAL_Init();                     
    Stm32_Clock_Init(360,25,2,8);  
    usart1_init(115200);
    delay_init(180);
        
        
        while(1)
        {
            if((USART_RX_STA&0x8000)==0)
            {
                if(USART_RX_STA&0x4000)
                {
                    if(aRxBuffer[0]!=0x0a)
                        USART_RX_STA=0;
                    else

                        USART_RX_STA|=0x8000;   
                        USART_RX_STA=0;
                        printf("输出:\n");
                        HAL_UART_Transmit(&UART1_Handler,USART_RX_BUF,USART_RX_STA&0X3FFF,1000);
                        delay_ms(1000);
                }
                else
                {   
                    if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
                    else
                    {
                        HAL_UART_Receive(&UART1_Handler,aRxBuffer,1,1000);
                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
                        USART_RX_STA++;
                        if(USART_RX_STA>(LEIGHT-1))USART_RX_STA=0;     
                    }         
                }
            }
               
        }


   
  }  
        
   



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2018-8-8
在线时间
50 小时
 楼主| 发表于 2018-8-9 00:01:58 | 显示全部楼层
新人还没搞懂中断,想通过简单的方式实现串口收发,这段代码不能接收到串口调试助手发送的内容,有没有大神指点迷津,万分感谢!
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-8-9 00:05:09 | 显示全部楼层
你没有打开中段
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-8-9 00:06:10 | 显示全部楼层
看看原子哥的例程
回复

使用道具 举报

9

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2018-8-8
在线时间
50 小时
 楼主| 发表于 2018-8-9 00:08:39 | 显示全部楼层
qiousanxi 发表于 2018-8-9 00:06
看看原子哥的例程

不打开中断就不能使用串口收发吗?麻烦解释下
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-9 08:57:00 | 显示全部楼层
不用中断的方式可以使用串口收发,判断接收/发送完成标志位就可以了。

楼主的问题是直接将例程中,串口接收中断的内容直接复制到了主循环中,当然是不可能正常工作的。楼主需要进行的修改是,查看STM32F4系列的参考手册,找到串口1接收完成标志位所在的寄存器,然后在主循环中不断地检测这个位是否被置位,如果被置位则说明串口1收到了一个字节数据,此时再进行例程中串口接收中断的操作,完成后把该标志清空即可。
十六进制带我飞。
回复

使用道具 举报

9

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2018-8-8
在线时间
50 小时
 楼主| 发表于 2018-8-9 10:20:11 | 显示全部楼层
DreamWaterPro 发表于 2018-8-9 08:57
不用中断的方式可以使用串口收发,判断接收/发送完成标志位就可以了。

楼主的问题是直接将例程中,串口 ...

哥,我明白你的意思,但是我没有完全复制例程。我的逻辑是通过HAL_UART_Receive函数接收一个数据并存放到aRxBuffer中,然后把aRxBuffer中的值存放到USART_RX_BUF,直到接收到0x0d,0x0a,然后通过HAL_UART_Transmit读取USART_RX_BUF中的数据。您有空的话能否帮我再看下代码,万分感谢
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-8-9
在线时间
1 小时
发表于 2018-8-9 14:34:15 | 显示全部楼层
不想用中断的话,你应该用轮询的方式去实现。你得主动去读相应的寄存器,看看是否有数据可读。 因为我没看过原子哥库函数版的,有些函数作用不太了解,但HAL_UART_Receive感觉也是基于中断处理函数之上的。个人感觉想搞的清楚点还是要多多了解寄存器的
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10983
金钱
10983
注册时间
2014-6-12
在线时间
1045 小时
发表于 2018-8-9 14:50:30 | 显示全部楼层
你既然不想按库的方法来,不如学寄存器编程方法,这样比较自由,你这种既用库初始化,又不想用库,是自己给自己找麻烦。
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-8-9 20:37:11 | 显示全部楼层
走投无路的卡卡 发表于 2018-8-9 00:08
不打开中断就不能使用串口收发吗?麻烦解释下

你去看下st官方的代码!有你想要的
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-10 10:12:32 | 显示全部楼层
走投无路的卡卡 发表于 2018-8-9 10:20
哥,我明白你的意思,但是我没有完全复制例程。我的逻辑是通过HAL_UART_Receive函数接收一个数据并存放到 ...

额不好意思,没有太仔细看,平常较少用到HAL库对其不是特别了解。

不过楼主可以看看调用HAL_UART_Receive()函数后的返回值是什么,是HAL_ERROR还是HAL_TIMEOUT?以及这个函数内部是不是需要依赖串口中断来工作的?
十六进制带我飞。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-12 20:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表