下位机每隔0.5秒通过串口传25个字节到上位机,串口接收到数据后处理并用zedgraph控件绘制实时曲线图,程序运行几分钟后,Datareceive事件触发后,BytesToRead的值有时候为0,有时是25,也有时是50,界面刷新有时也不是0.5秒。
接收程序:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (mySerialPort.IsOpen)
{
Thread.Sleep(10);
int count = mySerialPort.BytesToRead;
byte[] data = new byte[count];
mySerialPort.Read(data, 0, count);
if (data[0] == 0x01 && data[1] == 0x03)
{
this.Invoke(textChanged, data, count);
}
}
}
catch (Exception err)
{
throw err;
}
}
处理程序:
textChanged += new UpdateTextEventHandler(ChangeText);
private delegate void UpdateTextEventHandler(byte[] buffer,int m);//定义委托
private event UpdateTextEventHandler textChanged;//定义事件
private void ChangeText(byte[] buffer,int m) //事件处理方法
{
s1 = "";
Array.Copy(buffer, 3, float_byte1, 0, 4);
Array.Copy(buffer, 8, float_byte2, 0, 4);
Array.Copy(buffer, 13, float_byte3, 0, 4);
Array.Copy(buffer, 18, float_byte4, 0, 4);
temperture[0] = BitConverter.ToSingle(float_byte1, 0);
temperture[1] = BitConverter.ToSingle(float_byte2, 0);
temperture[2] = BitConverter.ToSingle(float_byte3, 0);
temperture[3] = BitConverter.ToSingle(float_byte4, 0);
textBox1.Text = temperture[0].ToString();
textBox2.Text = temperture[1].ToString();
textBox3.Text = temperture[2].ToString();
textBox4.Text = temperture[3].ToString();
for (int i = 0; i < m; i++)
{
s1 += buffer[i].ToString("X2");
s1 += " ";
}
textBox5.Text = s1.ToString();
if (Curve_Flag == 1)
{
i++;
creatGraph(temperture[j]);
}
}
zedgraph绘图:
public void creatGraph(float temp)
{
double x = (double)i;
double y = Convert.ToDouble(temp);
list.Add(x, y);
myCurve = zedGraphControl1.GraphPane.AddCurve("", list, Color.Red, SymbolType.None);
//myCurve.Symbol.Fill = new Fill(Color.Blue);//填充数据点
zedGraphControl1.AxisChange();//画到zedGraphControl1控件中,此句必加
zedGraphControl1.Refresh();//重新刷新
}