OpenEdv-开源电子网

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

STM32F103不使用中断,串口数据接收思路

[复制链接]

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2021-6-27
在线时间
36 小时
发表于 2021-10-20 09:32:18 | 显示全部楼层 |阅读模式

/*接收一串数据*///未成功板--》下面有成功版
uint8_t UART3GetByte( uint16_t *  GetData)
{
    static uint8_t leng = 0;
    uint8_t Length = 0;
       
//        if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)//接收信息标志位,接收到信息自动置1,软件清零
//        {
////                leng = 0;
//                return 0;//没有收到数据
//        }
//        else
    if((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET))
    {
        *GetData = USART_ReceiveData(USART3);
        GetData ++;
        leng++;
    }
    else if(USART_GetFlagStatus(USART3,USART_FLAG_IDLE)!=RESET)//接收空闲标志位
    {
        USART3->SR;//状态位
        USART3->DR;//数据位  读操作【读数据】可使RXNE位0

//                USART_ClearITPendingBit(USART3,USART_IT_RXNE);        //清除接收标志位,每次接收完成都需要清除一下
        Length = leng;
        leng = 0;
        return Length;
    }
    return 0;//收到数据
}


///*接收一串数据*///成功版本
uint8_t UART3GetByte( uint16_t  GetData[15])
{
    static uint8_t leng = 0;
    uint8_t Length = 0;
       
//        if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)//接收信息标志位,接收到信息自动置1,软件清零
//        {
////                leng = 0;
//                return 0;//没有收到数据
//        }
//        else
    if((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET))
    {
        GetData[leng++] = USART_ReceiveData(USART3);
//        leng++;
    }
    else if(USART_GetFlagStatus(USART3,USART_FLAG_IDLE)!=RESET)//接收空闲标志位
    {
        USART3->SR;//状态位
        USART3->DR;//数据位  读操作【读数据】可使RXNE位0

//                USART_ClearITPendingBit(USART3,USART_IT_RXNE);        //清除接收标志位,每次接收完成都需要清除一下
        Length = leng;
        leng = 0;
        return Length;
    }
    return 0;//收到数据
}
备注:求解释,使用指针是为了减少传输内存,以及可以接收不定长度数据,但 GetData ++;没有起到作用似的,测试结果,数据全部存在了第一个地址;换成数组就可以了,但数组与指针是可以相互替换的,为何我用指针就不行了?估计是要把指针设置成静态变量这种类型?

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

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8670
金钱
8670
注册时间
2020-5-11
在线时间
4138 小时
发表于 2021-10-20 10:09:10 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-10-20 10:11 编辑
ShineY 发表于 2021-10-20 10:01
是的,是局部变量,但如果转递的是地址的话,也是会变的才对

按我的例子来看,变的是buf[n]的内容,buf这个指针(或地址)并未改变。
你需要的是这样:
  1. int leng=0;//接收长度
  2. char rxbuf[100];//接收区
  3. uint8_t UART3GetByte(char *buf,int *len)
  4. {
  5. ...
  6. buf[*len]= USART_ReceiveData(USART3);
  7. (*len)++;
  8. }

  9. 调用 UART3GetByte(rxbuf,&leng);
复制代码


专治疑难杂症
回复 支持 1 反对 0

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8670
金钱
8670
注册时间
2020-5-11
在线时间
4138 小时
发表于 2021-10-20 09:57:19 | 显示全部楼层
GetData相当于局部变量,比如调用UART3GetByte(buf)退出之后buf并未改变。
专治疑难杂症
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2021-6-27
在线时间
36 小时
 楼主| 发表于 2021-10-20 10:01:28 | 显示全部楼层
LcwSwust 发表于 2021-10-20 09:57
GetData相当于局部变量,比如调用UART3GetByte(buf)退出之后buf并未改变。

是的,是局部变量,但如果转递的是地址的话,也是会变的才对
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2021-6-27
在线时间
36 小时
 楼主| 发表于 2021-10-20 10:17:02 | 显示全部楼层
LcwSwust 发表于 2021-10-20 10:09
按我的例子来看,变的是buf[n]的内容,buf这个指针(或地址)并未改变。
你需要的是这样:

懂了,谢谢你
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 00:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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