1.功能描述
接收串口数据,并将收到的十六进制数据用坐标系的方式将数据波形展示出来
2.代码部分
步骤1:定义链表,用于数据保存
//数据结构-线性链表
private List<byte> DataList = new List<byte>();
步骤2:定义波形颜色
//定义波形颜色
private Pen LinesPen = new Pen(Color.FromArgb(0xFF,0x00,0x00));//FF 00 00 为红色
步骤3:绘制接收数据的波形
//如果数据量大于可容纳的数据量,则删除最左数据
if (DataList.Count >= (this.ClientRectangle.Width - StartPrint) / DrawStep)
{
DataList.RemoveRange(0, DataList.Count - (this.ClientRectangle.Width - StartPrint) / DrawStep);
}
//绘制波形
for(int i = 0; i < DataList.Count - 1; i++)
{
//点与点之间做直线连接
e.Graphics.DrawLine(LinesPen, StartPrint + i * DrawStep, StartPrint + Unit_length * 16 - DataList[i] * (Unit_length / 16), StartPrint + (i + 1) * DrawStep, StartPrint + Unit_length * 16 - DataList[i + 1] * (Unit_length / 16));
}
步骤4:定义数据添加函数
//定义链表尾部添加数据
public void AddDataToWaveList(byte[] Data)
{
for (int i = 0; i < Data.Length; i++)
DataList.Add(Data[i]);
this.Invalidate();//刷新显示
}
步骤5:串口接收函数中添加代码
//更新波形显示窗体的链表数据
if(WaveForm != null)
{
WaveForm.AddDataToWaveList(data);
}
完整接收函数
//串口接收事件
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//接收格式为ASCII码
if (!checkBox16.Checked)//复用框没有被选择时
{
try
{
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
string str = serialPort1.ReadExisting();//将接收到的数据存在自定义的字符串变量中
textBox1.AppendText(str + "\r\n");
//统计接收字节数
UInt32 RBytes = Convert.ToUInt32(textBox7.Text, 10);//定义接收字节数变量,并初始化为已接收字节数
RBytes += (UInt32)str.Length;//加ASCII码字节数
textBox7.Text = Convert.ToString(RBytes, 10);//显示总接收字节数
}
catch
{
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
textBox1.AppendText("ASCII格式接收错误!\r\n");
}
}
//接收格式为HEX
else
{
try