在线时间434 小时
UID3066878
注册时间2014-12-11
NXP金币0
TA的每日心情 | 奋斗 2017-5-3 11:19 |
---|
签到天数: 10 天 连续签到: 1 天 [LV.3]偶尔看看II
金牌会员
 
- 积分
- 14090
- 最后登录
- 2024-4-19
|
本帖最后由 党国特派员 于 2016-12-8 17:25 编辑
在第一篇中我们对下位机的进行了解释及原理图代码进行了分析,这一篇我们要对上位机代码进行编写。
上位机采用C#语言进行编写,其实我觉使用c/c++和Qt进行可移植性会更好,只是Qt不是很熟悉,所以先采用C#吧。
首先我们把从下位机接受过来的数据放入一个FIFO的队列里(RecvBuf)。
- private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
- {
- if(e.EventType == System.IO.Ports.SerialData.Chars)
- {
- var x = (sender as SerialPort);
- var len = x.BytesToRead;
- byte[] buf = new byte[len];
- x.Read(buf, 0, len);
- Array.ForEach(buf, _ => {
- RecvBuf.Enqueue(_);
- Debug.WriteLine([ DISCUZ_CODE_0 ]quot;{_:X2}");
- });
- }
- }
复制代码 然后在一个timer里对数据进行解析,把解析好的数据推送给波形显示控件。让波形显示控件显示出波形。
- private void timer1_Tick(object sender, EventArgs e)
- {
- while(RecvBuf.Count >3)
- {
- uint dat = 0;
- byte tmp = RecvBuf.Dequeue();
- dat |= (uint)(tmp << 24);
- tmp = RecvBuf.Dequeue();
- dat |= (uint)(tmp << 16);
- tmp = RecvBuf.Dequeue();
- dat |= (uint)(tmp << 8);
- tmp = RecvBuf.Dequeue();
- dat |= tmp;
- waveformControl1.Push(dat);
- }
- }
复制代码
由于没有没有找到适合的波形显示控件,所以只有自己动手丰衣足食了。这里只帖关键部分的绘图代码:
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- if (this.DesignMode) return;
- var g = e.Graphics;
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- //设置原点坐标
- g.TranslateTransform(5, this.Height - 5);
- //垂直镜像
- g.ScaleTransform(1, -1);
- //画X,Y的坐标轴
- Pen p = new Pen(Color.Green, 1);
- p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
- g.DrawLine(p, PointF.Empty, new PointF(0, this.Height - 10));
- g.DrawLine(p, PointF.Empty, new PointF(this.Width - 5, 0));
- if (Data == null) return;
- //设置原点坐标到(10,10)
- g.TranslateTransform(10, 100);
- p.EndCap = System.Drawing.Drawing2D.LineCap.NoAnchor;
- PointF curPoint = PointF.Empty;
- //画高低电平的水平线
- int curHight = yHight/2;
- Array.ForEach(Data.ToArray(), _ =>
- {
- if ((_ & 0x7FFFFFFF) > 0x4e20)
- return;
- if((_ & 0x80000000) > 0)
- curPoint.Y = curHight;
- else
- curPoint.Y = -curHight;
- PointF dstPoint = curPoint;
- dstPoint.X += (_ & 0x7FFFFFFF) * xProportion;
- g.DrawLine(p, curPoint, dstPoint);
- curPoint = dstPoint;
- });
- //画垂直连线
- curPoint = PointF.Empty;
- Array.ForEach(Data.ToArray(), _ =>
- {
- if ((_ & 0x7FFFFFFF) > 0x4e20)
- return;
- curPoint.Y = curHight;
- PointF dstPoint = curPoint;
- dstPoint.Y = -curHight;
- g.DrawLine(p, curPoint, dstPoint);
- curPoint = dstPoint;
- curPoint.X += (_ & 0x7FFFFFFF) * xProportion;
- });
- }
复制代码
里面涉及到windows GDI+编程的知识,不知道的同学自行脑补哈。这个是最初的版本,非常的简陋,不过已经可以工作了。
下面是我自己的波形分析和使用logic16逻辑分析仪的对比。基本上还行,还需要完善。
下一步计划,波形控件支持放大缩小波形,支持超长波形的滚动显示。上位机使用多线程触发机制,波形数据做到实时解析和绘制。
下位机加入RTOS,使用自定义通讯协议,保证数据的正确传输。先到这里吧。。。
|
|