OpenEdv-开源电子网

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

可否”采集数据“和”声音播放“这两个功能同时进行

[复制链接]

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
发表于 2016-3-9 13:47:40 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 伊尹宝贝 于 2016-3-9 16:31 编辑

基于ADC实验和SD卡音乐播放实验,采集电压值后进行判断,当数值大于3v报警,播放歌曲,发现一个现象,当歌曲播放完,再进行下一个数据的采集,能否实现一遍播放歌曲,一遍采集数据呢?


                adcx=Get_Adc_Average(ADC_CH5,20);
                LCD_ShowxNum(150,330,i,4,16,0);//显示采集次数
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(134,350,adcx,1,16,0);//显示电压值
                temp-=adcx;
                LCD_ShowxNum(150,350,temp,3,16,0X80);

                if (adcx>2)
                {
                  audio_play();        //播放歌曲               
                }
                 delay_ms(50);

我希望的是,比如采集数据,开始报警,播放歌曲,一首歌有1分钟,而我是1s采集1个数据,那么我这首歌播放的期间,它会采集60个数据,如果这60个数据都正常,歌曲播放结束,停止播放,如果这60个数据有报警,歌曲还是会继续播放,播放的同时,数据继续采集。这相当于两个进程同时进行,我就是不清楚怎么让它同时执行。

谢谢~~



最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-9 13:47:41 | 显示全部楼层
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-3-9 15:07:25 | 显示全部楼层
这当然可以啦。
要修改一下播放函数audio_play( )的结构,用状态机来控制即可。
因为例程里面的audio_play( )函数有好几个while循环,将这些while结构全部改成状态机控制,就可以让CPU有机会做其它的事情。
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-3-9 15:48:12 | 显示全部楼层
本帖最后由 aozima 于 2016-3-9 16:05 编辑

我还以为一边放音乐一边录音呢,这样的话要做回音消除。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
 楼主| 发表于 2016-3-9 16:02:36 | 显示全部楼层
aozima 发表于 2016-3-9 15:48
我还以为一边放音乐一边录音呢,这样的话要做回音消息。

您好,我想问一下,什么是“回音消息”?
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-3-9 16:05:45 | 显示全部楼层
伊尹宝贝 发表于 2016-3-9 16:02
您好,我想问一下,什么是“回音消息”?

回音消除,手误打错字,罪过。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
 楼主| 发表于 2016-3-9 16:30:35 | 显示全部楼层
aozima 发表于 2016-3-9 16:05
回音消除,手误打错字,罪过。

您好,我不是很理解“回音消除”这个含义,看资料也没看到。
我希望的是,比如采集数据,开始报警,播放歌曲,一首歌有1分钟,而我是1s采集1个数据,那么我这首歌播放的期间,它会采集60个数据,如果这60个数据都正常,歌曲播放结束,停止播放,如果这60个数据有报警,歌曲还是会继续播放,播放的同时,数据继续采集。这相当于两个进程同时进行,我就是不清楚怎么让它同时执行。
回复

使用道具 举报

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
 楼主| 发表于 2016-3-9 16:39:23 | 显示全部楼层
adlu 发表于 2016-3-9 15:07
这当然可以啦。
要修改一下播放函数audio_play( )的结构,用状态机来控制即可。
因为例程里面的audio_pla ...

您好,我看了那几个while循环,但我还是不怎么理解,这相当于两个进程同时执行,具体怎么实现,有点迷糊,采集数据,然后报警播放歌曲,这个动作相当于中断,中断内容没执行完,怎么就能继续采集数据。还是可以理解stm32可以实现多个功能同时执行,并列关系,互不影响呢?谢谢

回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-3-9 17:39:08 | 显示全部楼层
解决的方法是改变程序架构。
如果你没用过状态机,就很难跟你说明白,看你个人的理解能力了。

回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-3-9 17:39:51 | 显示全部楼层
比如原来audio_play( )函数结构如下
audio_play( )
{
    decode_init();//初始化解码器
    f_open();//打开文件
    while(1) {
        f_read();//读数据
        send_data2decoder();//发送数据
        while( ! decode_complete);//等待数据播放完成
        if(f_eof())  break;//如果文件接收,退出循环
    }
    f_close();//关闭文件
    decode_deinit();//释放解码器
}
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-3-9 17:41:03 | 显示全部楼层
本帖最后由 adlu 于 2016-3-9 17:54 编辑

要改成如下结构:
audio_play( )
{
    switch (decode_status) {
    case INIT:
        decode_init();//初始化解码器
        decode_status = OPEN_FILE;
        break;
   case OPEN_FILE:
        f_open();//打开文件
        decode_status = SEND_DATA;
        break;
   case SEND_DATA:
        f_read();//读数据
        send_data2decoder();//发送数据
        decode_status = WAIT;
        break;
   case WAIT:
        if(decode_complete) { //等待数据播放完成
          if(f_eof()) {
             decode_status = EXIT;
             f_close();//关闭文件
             decode_deinit();//释放解码器
          } else {
              decode_status = SEND_DATA;
         }
        break;        
    }
}

回复

使用道具 举报

12

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
529
金钱
529
注册时间
2014-10-9
在线时间
145 小时
发表于 2016-3-9 17:45:56 | 显示全部楼层
可以加个ucos操作系统试试
回复

使用道具 举报

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
 楼主| 发表于 2016-3-9 17:50:10 | 显示全部楼层
adlu 发表于 2016-3-9 17:41
要改成如下结构:

亲,改成的结构没有显示出来,再发一遍呗,谢谢
回复

使用道具 举报

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
 楼主| 发表于 2016-3-9 17:50:46 | 显示全部楼层
小丶胖 发表于 2016-3-9 17:45
可以加个ucos操作系统试试

谢谢亲,操作系统有点难,以后尝试下
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-3-9 17:58:59 | 显示全部楼层
伊尹宝贝 发表于 2016-3-9 17:50
亲,改成的结构没有显示出来,再发一遍呗,谢谢

回复框太小了,刚才转到编辑框了。

这样,audio_play( )函数就可以分段运行了。
剩下的main( )函数结构就靠你自己了,我再写就啰嗦了。
回复

使用道具 举报

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
 楼主| 发表于 2016-3-9 18:03:26 | 显示全部楼层
adlu 发表于 2016-3-9 17:58
回复框太小了,刚才转到编辑框了。

这样,audio_play( )函数就可以分段运行了。

谢谢,我慢慢研究下~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 19:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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