查看: 6507|回复: 12

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

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

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

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

    在第一篇中我们对下位机的进行了解释及原理图代码进行了分析,这一篇我们要对上位机代码进行编写。
    上位机采用C#语言进行编写,其实我觉使用c/c++和Qt进行可移植性会更好,只是Qt不是很熟悉,所以先采用C#吧。
    首先我们把从下位机接受过来的数据放入一个FIFO的队列里(RecvBuf)。
    1.         private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    2.         {
    3.             if(e.EventType == System.IO.Ports.SerialData.Chars)
    4.             {
    5.                 var x = (sender as SerialPort);
    6.                 var len = x.BytesToRead;
    7.                 byte[] buf = new byte[len];
    8.                 x.Read(buf, 0, len);
    9.                 Array.ForEach(buf, _ => {
    10.                     RecvBuf.Enqueue(_);
    11.                     Debug.WriteLine([        DISCUZ_CODE_0        ]quot;{_:X2}");
    12.                 });
    13.             }
    14.         }
    复制代码
    然后在一个timer里对数据进行解析,把解析好的数据推送给波形显示控件。让波形显示控件显示出波形。
    1.         private void timer1_Tick(object sender, EventArgs e)
    2.         {
    3.             while(RecvBuf.Count >3)
    4.             {
    5.                 uint dat = 0;
    6.                 byte tmp = RecvBuf.Dequeue();
    7.                 dat |= (uint)(tmp << 24);
    8.                 tmp = RecvBuf.Dequeue();
    9.                 dat |= (uint)(tmp << 16);
    10.                 tmp = RecvBuf.Dequeue();
    11.                 dat |= (uint)(tmp << 8);
    12.                 tmp = RecvBuf.Dequeue();
    13.                 dat |= tmp;
    14.                 waveformControl1.Push(dat);
    15.             }
    16.         }
    复制代码

    由于没有没有找到适合的波形显示控件,所以只有自己动手丰衣足食了。这里只帖关键部分的绘图代码:
    1.         protected override void OnPaint(PaintEventArgs e)
    2.         {
    3.             base.OnPaint(e);
    4.             if (this.DesignMode) return;

    5.             var g = e.Graphics;
    6.             g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    7.             //设置原点坐标
    8.             g.TranslateTransform(5, this.Height - 5);
    9.             //垂直镜像
    10.             g.ScaleTransform(1, -1);

    11.             //画X,Y的坐标轴
    12.             Pen p = new Pen(Color.Green, 1);
    13.             p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
    14.             g.DrawLine(p, PointF.Empty, new PointF(0, this.Height - 10));
    15.             g.DrawLine(p, PointF.Empty, new PointF(this.Width - 5, 0));


    16.             if (Data == null) return;
    17.             //设置原点坐标到(10,10)
    18.             g.TranslateTransform(10, 100);
    19.             p.EndCap = System.Drawing.Drawing2D.LineCap.NoAnchor;
    20.             PointF curPoint = PointF.Empty;

    21.             //画高低电平的水平线
    22.             int curHight = yHight/2;
    23.             Array.ForEach(Data.ToArray(), _ =>
    24.             {
    25.                 if ((_ & 0x7FFFFFFF) > 0x4e20)
    26.                     return;
    27.                 if((_ & 0x80000000) > 0)
    28.                     curPoint.Y = curHight;
    29.                 else
    30.                     curPoint.Y = -curHight;
    31.                 PointF dstPoint = curPoint;
    32.                 dstPoint.X += (_ & 0x7FFFFFFF) * xProportion;
    33.                 g.DrawLine(p, curPoint, dstPoint);
    34.                 curPoint = dstPoint;
    35.             });
    36.             //画垂直连线
    37.             curPoint = PointF.Empty;
    38.             Array.ForEach(Data.ToArray(), _ =>
    39.             {
    40.                 if ((_ & 0x7FFFFFFF) > 0x4e20)
    41.                     return;
    42.                 curPoint.Y = curHight;
    43.                 PointF dstPoint = curPoint;
    44.                 dstPoint.Y = -curHight;
    45.                 g.DrawLine(p, curPoint, dstPoint);
    46.                 curPoint = dstPoint;
    47.                 curPoint.X += (_ & 0x7FFFFFFF) * xProportion;
    48.             });
    49.         }
    复制代码


    里面涉及到windows GDI+编程的知识,不知道的同学自行脑补哈。这个是最初的版本,非常的简陋,不过已经可以工作了。
    下面是我自己的波形分析和使用logic16逻辑分析仪的对比。基本上还行,还需要完善。
    QQ图片20161103224413.png

    下一步计划,波形控件支持放大缩小波形,支持超长波形的滚动显示。上位机使用多线程触发机制,波形数据做到实时解析和绘制。
    下位机加入RTOS,使用自定义通讯协议,保证数据的正确传输。先到这里吧。。。

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

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-11-4 11:44:48 | 显示全部楼层
    不错,支持一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2016-11-4 13:08:28 | 显示全部楼层
    赞呀,上位机程序还不会编。
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-19 17:41
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    1

    主题

    58

    帖子

    0

    注册会员

    Rank: 2

    积分
    117
    最后登录
    2016-12-20
    发表于 2016-11-4 13:17:11 | 显示全部楼层
    顶一个!
    上位机好多人不会。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-11-4 14:31:14 | 显示全部楼层
    厉害                             
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
    发表于 2016-11-4 15:34:14 | 显示全部楼层
    你的单片机用什么列
    不知道大家放假了吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-16 10:29
  • 签到天数: 41 天

    连续签到: 1 天

    [LV.5]常住居民I

    3

    主题

    216

    帖子

    0

    高级会员

    Rank: 4

    积分
    539
    最后登录
    2017-10-11
    发表于 2016-11-4 20:08:05 | 显示全部楼层
    这个代码直接看晕了……看不懂怎么办!
    开开好心情!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-11-28 08:45
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    67

    帖子

    0

    注册会员

    Rank: 2

    积分
    133
    最后登录
    2020-6-28
    发表于 2016-11-4 22:03:09 | 显示全部楼层
    那是逻辑分析仪吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2016-11-5 11:22:50 | 显示全部楼层
    厉害。c#上位机
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
     楼主| 发表于 2016-11-5 18:41:01 | 显示全部楼层
    abbit-1988 发表于 2016-11-4 22:03
    那是逻辑分析仪吧

    红外的逻辑分析...
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-21 20:48 , Processed in 0.101649 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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