C# 串口波形显示

C#做的串口示波器,可以实现动态波形显示的效果。


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

using System.Text.RegularExpressions;

namespace serial1

{

public partial class Form1 : Form

{

int maxRate; //最大比例

private bool listening = false;

private bool closing = false;

Point lastPoint,nowPoint;

List<double> l = new List<double>(); //存储串口接收的值

Graphics g; //生成图形

Pen drawPen=new Pen(Color.Red,1);

private StringBuilder builder = new StringBuilder();

private SerialPort comm = new SerialPort();

public Form1()

{

InitializeComponent();

}

private void pictureBox1_Paint(object sender, PaintEventArgs e)

{

g = e.Graphics;

pictureBox1.Width = l.Count();

g.DrawLine(new Pen(Color.Black, 1), new Point(0, pictureBox1.Height / 2), new Point(pictureBox1.Width, pictureBox1.Height / 2));

lastPoint = new Point(0,pictureBox1.Height/2);

//如果发生值大于最大值,则画笔变为黄色

for (int i = 1; i < this.pictureBox1.Width; i++)

{

if (l[i] > maxRate/2)

{

drawPen.Color = Color.Yellow;

l[i] = maxRate/2;

}

else

{

drawPen.Color = Color.Red;

}

nowPoint.X = i;

double tmpY = l[i] / maxRate;

tmpY =Math.Abs( (tmpY * pictureBox1.Height)-(pictureBox1.Height/2));

nowPoint.Y =Convert.ToInt32( tmpY);

//nowPoint.Y = Math.Abs(l[i] / maxRate * pictureBox1.Height - pictureBox1.Height);

g.DrawLine(drawPen, lastPoint, nowPoint);

lastPoint = nowPoint;

}

}

private void Form1_Load(object sender, EventArgs e)

{

}

void comm_dataReceived(object sender, SerialDataReceivedEventArgs e)

{

if (closing) return; //防止关闭时锁死

string tmpS = comm.ReadLine();

builder.Append(tmpS);

string s = builder.ToString();

builder.Clear();//清除字符串构造器

string[] arr = s.Split(‘\n‘, ‘\r‘).Where(t => t.Trim() != "").ToArray();

////因为要访问ui资源,所以需要使用invoke方式同步ui。

this.Invoke((EventHandler)(delegate

{

try

{

int tmpC=0;

listening = true;

for (int i = 0; i < arr.Length; i++)

{

int c = Convert.ToInt32(arr[i]);

if (Math.Abs(tmpC - c) > 100) Console.Out.WriteLine("错误");

textBox1.AppendText(Convert.ToString(c)+‘\n‘);

l.Add(c);

tmpC = c;

}

}

catch

{

;

}

finally

{

listening = false;

}

pictureBox1.Width = l.Count();

}));

}

private void button1_Click(object sender, EventArgs e)

{

comm.PortName = comboBox1.SelectedItem.ToString();

comm.BaudRate =Convert.ToInt32( comboBox2.SelectedItem.ToString());

maxRate =Convert.ToInt32( textBox2.Text);

comm.Open();

comm.DataReceived += comm_dataReceived;

}

private void button2_Click(object sender, EventArgs e)

{

closing = true;

while (listening) Application.DoEvents();

MessageBox.Show("ok");

comm.Close();

closing = false;

}

private void button4_Click(object sender, EventArgs e)

{

//16进制发送

if (checkBoxHexSend.Checked)

{

//我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数

MatchCollection mc = Regex.Matches(txSend.Text, @"(?i)[/da-f]{2}");

List<byte> buf = new List<byte>();//填充到这个临时列表中

//依次添加到列表中

foreach (Match m in mc)

{

buf.Add(byte.Parse(m.Value));

}

//转换列表为数组后发送

comm.Write(buf.ToArray(), 0, buf.Count);

}

else//ascii编码直接发送

{

//包含换行符

if (checkBoxNewlineSend.Checked)

{

comm.WriteLine(txSend.Text);

}

else//不包含换行符

{

comm.Write(txSend.Text);

}

}

}

}

}

时间: 2024-08-30 01:28:21

C# 串口波形显示的相关文章

玩转X-CTR100 | X-PrintfScope波形显示

更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器配套的X-PrintfScope串口波形显示功能的使用,如其名,软件最大亮点是可以通过C语言Printf函数实现波形显示功能,使用简单灵活.另外也支持常规的串口通信协议,实现高效率传输. 原理介绍 X-CTR100控制器配套X-PrintfScope串口波形显示软件,具有八个显示通道,最大特点是可通过C标准库函数printf增加@标识实现数据波形显示

[转] 基于C#的波形显示控件的实现

转自 基于C#的波形显示控件的实现[附完整源码下载] 编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的数据进行处理和保存,并以图形的方式显示),整个项目边学C# WinForm边设计,这个波形显示控件就是项目中的一部分,也花了自己绝大多数时间.此外,顺便将该波形显示控件当作自己毕业设计的内容,下文实际上是节选自自己的本科毕业论文,希望对大家能有所帮助.代码以及文章有疏漏.错误.不妥之处在所难免,欢迎

Modelsim设置数据以模拟波形显示

选中希望以模拟波形显示的信号,右击选择format->Analog(automatic) 如果你的数据是用无符号数表示一个完整的波形的,那么可能显示出来的波形样子是下面的样子,不过不要紧,这是因为modelsim默认是按照有符号数据解析波形数据的缘故,我们可以再进行一次设置修改. 选中希望显示波形的信号,右击,选择Radix->Unsigned. 设置完成后,波形就如下所示了: 是不是发现虽然波形已经是完整的正弦波了,但是波形有部分却跑到其他信号的地盘去了呢?这也不要紧,是模拟波形的显示范围设

[问题笔记][串口只能显示不能输入]

问题描述: 在做实验时,串口无法输入,但有输出显示.换了一根串口线后可以正常显示和接收信号. 问题分析: 串口有两根信号线,tx(传输信号)和rx(接收信号).串口有输出说明传输信号在正常工作,可能是接收信号无法工作造成无法输入.通过短接tx和rx,把传输信号直接输入到接收信号,如果无法正常工作说明接收接收信号坏了. 详细步骤: 1.把串口线接到PC上,打开串口终端 2.短接tx和rx信号 3.在键盘上输入,如果在屏幕上有回显说明,tx与rx都在正常工作:否则,判断是串口坏了

modelsim仿真时让状态机波形显示状态的名字

在使用Verilog编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示(如IDLE等).当使用ModelSim仿真的时候,状态机变量在wave窗口中以二进制编码的形式显示,如下面所示,这种显示形式不是很直观,但我们可以使用ModelSim提供的命令将状态机变量以“文本”形式的参数名显示,从而有利于调试. 下面以一个实例来说明. 代码来源:http://www.cnblogs.com/oomusou/archive/2011/06/05/fsm_coding_style.html 源文件:

python 实现wav的波形显示(时域和频域)

音频处理中,经常要看一下啊频域图是什么样子的,这里自己写了一个小程序,可以完美的同步显示时域和频域图,直接上代码: 1 #wave data -xlxw 2 3 #import 4 import wave as we 5 import numpy as np 6 import matplotlib.pyplot as plt 7 import sys 8 9 def wavread(path): 10 wavfile = we.open(path,"rb") 11 params = w

C#上位机串口控制12864显示

实现的效果 上面是用Proteus仿真的,,对了如果自己想用proteus仿真需要安装下面这个软件 再看一下实物显示效果 先做上位机部分........... 为了程序一启动就把电脑上能用的串口号显示在下拉框中 private void Form1_Load(object sender, EventArgs e) { string[] ComName = SerialPort.GetPortNames();//把可用的串口号存入comname comboBoxCom.Items.AddRange

51获取6050原始数据并通过匿名上位机显示波形

其实之前就用stm32获取过6050的原始数据,但是当时只是为了用而用,对他的理解并不深入,也不明白到底是怎么获得这些数据的. 这几天回归原始,通过STC89C52RC,再一次对6050进行驱动,并获取原始数据.经过几天的努力,现在其实感觉6050没有想象中的那么复杂,复杂的是后面对他的数据进行的滤波和姿态解算.获取数据其实就是对里面的一些寄存器进行配置.但是要求熟练掌握单片机的 IIC 通信协议.通信协议这东西其实看着很简单,但是实际用起来有很多细节方面的东旭需要注意.关于具体 IIC 的通信

调用CImg库显示WAV格式音频波形

在做傅里叶变换和小波变换时经常要通过显示波形来检验算法,但通过visual studio之类显示波形又显得麻烦,而且不能跨平台. CImg是一个跨平台的C++的图像处理库,提供的图像处理等功能十分强大,而且加入项目中十分轻便,只需将头文件包含在项目中即可,十分轻便. 可自行到http://www.cimg.eu/下载 利用它来在linux.Mac OS X中显示波形,再合适不过了,下面是音频波形显示的代码. 主函数 main.cpp #include <iostream> #include &