一个模仿示波器的串口通讯程序的思路,代码和问题,请大家多指教。
这是一个上位机程序,接受来自单片机的16位数据。然后将数据波形显示出来并存储。下位机以数据包的形式将数据发过来,一个数据包有208个字节,以0x55 0xAA OxAA 0x55这4字节为数据包的头,发送的频率是100ms,胸部信号数据为第14个到54个字节,腿部信号数据为从第55个到第95个字节,程序就是从这数据包里将这80个字节提取出来,2个字节一结合,换成数,然后画出来。接受数据用的是serialport的,dataReceived事件,触发事件的字节数是208个,事件结束后清空缓冲区。画图用的是野比的波形图控件,存储写了一个writefile函数。以下是主要代码
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Timers;
using
using System.Runtime.InteropServices;
using
namespace test
{
public partial class Form1 : Form
{
int[] cd = new int[20];//胸部的值
int[] ld = new int[20];//腿部的值
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.PortName = "com1";//设定串口号
serialPort1.open();
}
private void serialPort1_DataReceived(object sender, e)//事件
{ byte[] data=new byte[208];
for (int i = 0; i < 208; i++)
{
data[i] = Convert.ToByte(serialPort1.ReadByte());
}
if (data[0] == 0x55 && data[1] == 0xAA&&data[2]==0xAA&&data[3]==0x55)//检验包头是否正确
{
int[] data2 = new int[40];//提取有效数据
int[] data3 = new int[40];
for (int i = 14; i < 54; i++)
{
data2[i - 14] = data[i];
}
for (int i = 54; i < 94; i++)
{
data3[i - 54] = data[i];
}
for (int i = 0; i < 20; i++)//40个字节,20个数据
{
cd[i] = (data2[2 * i] * 256 + data2[2 * i + 1]);
ld[i] = (data3[2 * i] * 256 + data3[2 * i + 1]);
statusChart1.Value = cd[i];//画图
statusChart2.Value = ld[i];
}
else
{
messagebox.show("丢包了");
}
serialPort1.DiscardInBuffer();//清空串口缓冲区
}
程序写完了但是问题很多。
1.显示丢包提示,但是没有明显丢包的现象。
2.设了一个label,label.text=serialPort1.BytesToRead,发现大于208字节,所以感觉串口没有清空。
3.程序运行一段时间后会变卡,也就是画图变慢,但是关掉重启,就重新恢复顺畅。
4.如果不做检验,程序会流畅多,但是经过一分钟后,会出现明显的丢包现象,就是波形出现空白段。
[ 本帖最后由 mozhaodi 于 2009-9-10 11:54 编辑 ]