查看: 4231|回复: 9

[原创] 【LPC800项目】红外分析仪(3)

[复制链接]
  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-11-24 22:01:38 | 显示全部楼层 |阅读模式
    本帖最后由 党国特派员 于 2016-12-8 17:26 编辑

    在第二篇,我们已经实现在红外数据采集的主要功能,但是存在着一些缺陷。首先下位机没有起始和停止信号,导致采集数据太长,在上位机显示造成不便。再次在主循环里有延时函数,对数据的传输造成一定的影响。在这版里先对下位机进行改进。
    1、下位机接收到上位机的采集开始信号,再进行数据的采集。
    2、加入更的控制变量,使采集传输更合理
    3、优化双缓冲采集算法,使得效率更高
    4、去除主循环的等待,把工作指示灯放入定时器里。提高传输的实时性。
    主程序代码如下:
    1. #include "mbed.h"
    2. #include "main.h"

    3. //全局变量
    4. DigitalOut GreenLed(P0_16);
    5. DigitalOut RedLed(P0_15);
    6. InterruptIn InfraRed(P0_18);
    7. Ticker IrTicker;
    8. Timer IrTimer;
    9. Timeout IrTimeout;
    10. Serial pc(USBTX,USBRX);

    11. //能否上传
    12. bool CanTransfer;
    13. //开始采集红外信息号标记
    14. bool startFlag;
    15. //红外数据
    16. IrDataType IrDat = {
    17.     .datBuffer1 = {0},
    18.     .datBuffer2 = {0},
    19.     .pRecvBuf = NULL,
    20.     .pSendBuf = NULL,
    21.     .i = 0
    22. };


    23. int main()
    24. {
    25.     CanTransfer = false;
    26.     GREEN_LED_OFF;

    27.     //串口设置
    28.     pc.baud(115200);
    29.     pc.attach(_uartRecv,SerialBase::RxIrq);

    30.     //设置红外的上升沿和下降沿中断
    31.     InfraRed.mode(PullNone);
    32.     InfraRed.fall(&_fall);
    33.     InfraRed.rise(&_rise);
    34.         
    35.         //设置LED
    36.         IrTicker.attach(&ToggleLed,1.0);

    37.     //主循环
    38.     while(1)
    39.     {
    40.         if(CanTransfer)
    41.         {
    42.             if(IrDat.pSendBuf != NULL)
    43.             {
    44.                 while(*IrDat.pSendBuf != 0x0)
    45.                 {
    46.                     uint8_t* pp = (uint8_t*)IrDat.pSendBuf;
    47.                     pp += 3;
    48.                     pc.putc(*pp--);
    49.                     pc.putc(*pp--);
    50.                     pc.putc(*pp--);
    51.                     pc.putc(*pp--);

    52.                     *IrDat.pSendBuf = 0;
    53.                     IrDat.pSendBuf++;
    54.                 }
    55.                 IrDat.pSendBuf = NULL;
    56.             }
    57.         }
    58.     }
    59. }


    60. //下降沿处理
    61. void _fall()
    62. {
    63.     //判断是否开始
    64.     if(!startFlag) return;

    65.     //高电平时间 最高位置1
    66.     uint32_t us = IrTimer.read_us() | 0x80000000;
    67.     IrTimer.reset();

    68.     HandleIrBuffer();
    69.     IrDat.pRecvBuf[IrDat.i] = us;
    70.     IrDat.i++;
    71.     GREEN_LED_ON;
    72. }

    73. //上升沿处理
    74. void _rise()
    75. {
    76.     //判断是否开始
    77.     if(!startFlag) return;

    78.     //低电平时间 最高位置0
    79.     uint32_t us = IrTimer.read_us() & 0x7FFFFFFF;
    80.     IrTimer.reset();

    81.     HandleIrBuffer();
    82.     IrDat.pRecvBuf[IrDat.i] = us;
    83.     IrDat.i++;
    84.     GREEN_LED_OFF;
    85. }

    86. //uart接收中断
    87. void _uartRecv()
    88. {
    89.     char c = pc.getc();
    90.         //接收到‘s’,开始采集
    91.     if(c == 's' || c == 'S')
    92.     {
    93.         //设置Timer.
    94.         IrTimer.reset();
    95.         IrTimer.start();

    96.         //设置Timeout;
    97.         IrTimeout.attach(_timeoutFunc,5);
    98.                 //开始采集
    99.         startFlag = true;
    100.     }
    101. }

    102. //超时中断
    103. void _timeoutFunc()
    104. {
    105.         //停止采集
    106.     startFlag = false;
    107. }

    108. //处理红外数据缓冲区
    109. void HandleIrBuffer()
    110. {
    111.     //判断是否为第一次
    112.     if(IrDat.pRecvBuf == NULL)
    113.     {
    114.         IrDat.pRecvBuf = IrDat.datBuffer1;
    115.         IrDat.pSendBuf = NULL;
    116.         IrDat.i = 0;
    117.     }
    118.     else if(IrDat.i >= IRBUF_LEN)
    119.     {
    120.         //交换缓冲区
    121.         IrDat.pSendBuf = IrDat.pRecvBuf;
    122.         IrDat.pRecvBuf = (IrDat.pRecvBuf == IrDat.datBuffer1 ? IrDat.datBuffer2 : IrDat.datBuffer1);
    123.         IrDat.i = 0;
    124.         CanTransfer = true;
    125.     }
    126. }

    127. //LED转换
    128. void ToggleLed()
    129. {
    130.     //Blink LED
    131.         RedLed = !RedLed;
    132. }

    复制代码

    代码使用Mbed可移植性更好。
    程序里已经做了详细的注释,如果感兴趣,可以一起讨论。
    下位机代码基本上已经定型不会再做过多的修改,除非是有BUG存在。下一步主要是上位机部分的功能改进了。

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-4 23:20
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    9

    主题

    573

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2017-3-3
    发表于 2016-11-25 10:50:06 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情

    2022-6-3 10:27
  • 签到天数: 131 天

    连续签到: 1 天

    [LV.7]常住居民III

    19

    主题

    519

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1611
    最后登录
    2022-6-26
    发表于 2016-11-25 12:10:27 | 显示全部楼层
    不错啊
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-11-25 15:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    17

    帖子

    0

    新手上路

    Rank: 1

    积分
    38
    最后登录
    2016-12-21
    发表于 2016-11-25 15:52:25 | 显示全部楼层
    谢楼主无私分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2016-11-25 21:40:17 | 显示全部楼层
    多谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-12-26 12:04
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    4

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    620
    最后登录
    2018-7-6
    发表于 2016-11-29 09:51:21 | 显示全部楼层
    谢谢分享 上位机怎么做的?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
     楼主| 发表于 2016-11-29 09:56:36 | 显示全部楼层
    Y.fei 发表于 2016-11-29 09:51
    谢谢分享 上位机怎么做的?

    上位机用C#,目前还在完善中。也会放出源码和文档说明。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-12-26 12:04
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    4

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    620
    最后登录
    2018-7-6
    发表于 2016-11-29 09:57:47 | 显示全部楼层
    党国特派员 发表于 2016-11-29 09:56
    上位机用C#,目前还在完善中。也会放出源码和文档说明。

    期待你的成果
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2016-11-30 12:52:10 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2016-11-30 13:10:31 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 10:21 , Processed in 0.107463 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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