读取串行端口在 windows XP 中工作良好但在 windows 7 中停止工作并变慢
Read serial port work good in windows XP but stop working and slow in windows 7
我说的是 C# 编程和串口通信,在 Windows 7 和 XP 中有不同的结果。
我的代码是:
int count = 0;
float data1;
float data2;
private void button1_Click(object sender, EventArgs e)
{
serialPort1.PortName = textBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(textBox2.Text);
serialPort1.Open();
serialPort1.Write("?");
}
private void button2_Click(object sender, EventArgs e)
{
serialPort1.Close();
}
private void button3_Click(object sender, EventArgs e)
{
//string pathfile = @"C:\Documents and Settings\Dlab\Desktop\";
//string filename = "data1.txt";
//System.IO.File.WriteAllText(pathfile + filename, chart1.SaveImage();
// this.chart1.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data1p.png", System.Drawing.Imaging.ImageFormat.Gif);
//Bitmap bmp1 = new Bitmap(500, 500);
//chart1.DrawToBitmap(bmp1, new Rectangle(0, 0, 500, 500));
//bmp1.Save(@"C:\Documents and Settings\Dlab\Desktop\data1b.png");
//chart1.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data1t.text");
//this.chart2.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data2p.png", System.Drawing.Imaging.ImageFormat.Gif);
//Bitmap bmp2 = new Bitmap(500, 500);
//chart2.DrawToBitmap(bmp2, new Rectangle(0, 0, 500, 500));
//bmp2.Save(@"C:\Documents and Settings\Dlab\Desktop\data2b.png");
//chart2.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data12.text");
}
private void Form1_Load(object sender, EventArgs e)
{
// string[] ports = SerialPort.GetPortNames();
//foreach (string port in ports)
//{
// comboBox1.Items.Add(port);
// }
}
byte[] rs = new byte[53];
int rscnt = 0;
// DateTime then = DateTime.Now;
// float dt;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (e.EventType != SerialData.Chars) return;
rscnt += serialPort1.Read(rs, rscnt, 53 - rscnt);
if (rscnt == 53)
{
this.BeginInvoke(new Action(() => type(rs)));
rs = new byte[53];
rscnt = 0;
}
}
private void type(byte[] data)
{
//if (rs[0] == 65)
//{
// }
//DateTime now = DateTime.Now;
//dt = ((now.Second - then.Second));
//label8.Text = dt.ToString();
//textBox3.Text = dt.ToString();
data1 = ((rs[1] * 65536) + (rs[2] * 256) + (rs[3])-10000000)/100;
data2 = ((rs[4] * 16777216) + (rs[5] * 65536) + (rs[6] * 256) + (rs[7])-1000000000)/2136;
count++;
label5.Text = count.ToString();
label3.Text = data1.ToString();
label4.Text = data2.ToString();
//chart1.Series[0].Points.AddXY(count, data1);
//chart2.Series[0].Points.AddXY(count, data2);
//list1.Add(count, rs[1]);
//zedGraphControl1.GraphPane.AddCurve("", list1, Color.Red);
//zedGraphControl1.AxisChange();
// zedGraphControl1.Refresh();
serialPort1.DiscardInBuffer();
}
// PointPairList list1 = new PointPairList();
}
}
这个程序在 windows XP 中运行良好,但是当我在 windows 7 中尝试时,它很慢,得到错误的数据,然后停止工作。
我在 windows 7 和 xp 中再次编写了这个程序,并在 visual studio 2008 和 2012 中对其进行了测试,但我得到了相同的结果。
private void type(byte[] data)
{
...
serialPort1.DiscardInBuffer();
}
这真是一个讨厌的错误。您正在丢弃接收缓冲区中永远不应丢弃的字节。您执行此操作的确切时间是高度不可预测的,它取决于 type() 何时开始 运行ning。 UI 线程上的哪个 运行,那个时间 非常 不可预测,并且肯定会受到 OS 你 运行 这个上的影响.这在 XP 上完全有效只是运气。
使用 DiscardInBuffer() 几乎永远不会正确,只能在调用 SerialPort.Open() 之后立即使用它以从接收缓冲区中清除旧数据。或者从协议错误中恢复,尝试重新同步发送器和接收器。但是您没有协议,像这样丢弃字节只会产生缺少一组随机字节的垃圾数据。产生延迟,您只能从下一次传输中获得填充了 some 字节的缓冲区。并且崩溃,无论你对损坏的数据做什么,都可能会严重崩溃。
您必须删除该声明。
我说的是 C# 编程和串口通信,在 Windows 7 和 XP 中有不同的结果。 我的代码是:
int count = 0;
float data1;
float data2;
private void button1_Click(object sender, EventArgs e)
{
serialPort1.PortName = textBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(textBox2.Text);
serialPort1.Open();
serialPort1.Write("?");
}
private void button2_Click(object sender, EventArgs e)
{
serialPort1.Close();
}
private void button3_Click(object sender, EventArgs e)
{
//string pathfile = @"C:\Documents and Settings\Dlab\Desktop\";
//string filename = "data1.txt";
//System.IO.File.WriteAllText(pathfile + filename, chart1.SaveImage();
// this.chart1.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data1p.png", System.Drawing.Imaging.ImageFormat.Gif);
//Bitmap bmp1 = new Bitmap(500, 500);
//chart1.DrawToBitmap(bmp1, new Rectangle(0, 0, 500, 500));
//bmp1.Save(@"C:\Documents and Settings\Dlab\Desktop\data1b.png");
//chart1.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data1t.text");
//this.chart2.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data2p.png", System.Drawing.Imaging.ImageFormat.Gif);
//Bitmap bmp2 = new Bitmap(500, 500);
//chart2.DrawToBitmap(bmp2, new Rectangle(0, 0, 500, 500));
//bmp2.Save(@"C:\Documents and Settings\Dlab\Desktop\data2b.png");
//chart2.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data12.text");
}
private void Form1_Load(object sender, EventArgs e)
{
// string[] ports = SerialPort.GetPortNames();
//foreach (string port in ports)
//{
// comboBox1.Items.Add(port);
// }
}
byte[] rs = new byte[53];
int rscnt = 0;
// DateTime then = DateTime.Now;
// float dt;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (e.EventType != SerialData.Chars) return;
rscnt += serialPort1.Read(rs, rscnt, 53 - rscnt);
if (rscnt == 53)
{
this.BeginInvoke(new Action(() => type(rs)));
rs = new byte[53];
rscnt = 0;
}
}
private void type(byte[] data)
{
//if (rs[0] == 65)
//{
// }
//DateTime now = DateTime.Now;
//dt = ((now.Second - then.Second));
//label8.Text = dt.ToString();
//textBox3.Text = dt.ToString();
data1 = ((rs[1] * 65536) + (rs[2] * 256) + (rs[3])-10000000)/100;
data2 = ((rs[4] * 16777216) + (rs[5] * 65536) + (rs[6] * 256) + (rs[7])-1000000000)/2136;
count++;
label5.Text = count.ToString();
label3.Text = data1.ToString();
label4.Text = data2.ToString();
//chart1.Series[0].Points.AddXY(count, data1);
//chart2.Series[0].Points.AddXY(count, data2);
//list1.Add(count, rs[1]);
//zedGraphControl1.GraphPane.AddCurve("", list1, Color.Red);
//zedGraphControl1.AxisChange();
// zedGraphControl1.Refresh();
serialPort1.DiscardInBuffer();
}
// PointPairList list1 = new PointPairList();
}
}
这个程序在 windows XP 中运行良好,但是当我在 windows 7 中尝试时,它很慢,得到错误的数据,然后停止工作。
我在 windows 7 和 xp 中再次编写了这个程序,并在 visual studio 2008 和 2012 中对其进行了测试,但我得到了相同的结果。
private void type(byte[] data)
{
...
serialPort1.DiscardInBuffer();
}
这真是一个讨厌的错误。您正在丢弃接收缓冲区中永远不应丢弃的字节。您执行此操作的确切时间是高度不可预测的,它取决于 type() 何时开始 运行ning。 UI 线程上的哪个 运行,那个时间 非常 不可预测,并且肯定会受到 OS 你 运行 这个上的影响.这在 XP 上完全有效只是运气。
使用 DiscardInBuffer() 几乎永远不会正确,只能在调用 SerialPort.Open() 之后立即使用它以从接收缓冲区中清除旧数据。或者从协议错误中恢复,尝试重新同步发送器和接收器。但是您没有协议,像这样丢弃字节只会产生缺少一组随机字节的垃圾数据。产生延迟,您只能从下一次传输中获得填充了 some 字节的缓冲区。并且崩溃,无论你对损坏的数据做什么,都可能会严重崩溃。
您必须删除该声明。