serie - serial port c# example
Leer puerto serie funciona bien en Windows XP pero deja de funcionar y lento en Windows 7 (1)
private void type(byte[] data)
{
...
serialPort1.DiscardInBuffer();
}
Esa es una diablos de un error desagradable. Estás desperdiciando bytes en el búfer de recepción que nunca deberían descartarse. El momento exacto en que lo hace es altamente impredecible, depende de cuándo se iniciará la ejecución de tipo (). Lo cual se ejecuta en el hilo de la interfaz de usuario, ese momento es muy impredecible y sin duda se ve afectado por el sistema operativo en el que ejecuta esto. Que esto funcione en XP es solo suerte ciega.
El uso de DiscardInBuffer () casi nunca es correcto, solo debe usarse inmediatamente después de llamar a SerialPort.Open () para purgar los datos antiguos del búfer de recepción. O para recuperarse de un error de protocolo, tratando de volver a sincronizar el transmisor y el receptor. Pero no tiene protocolo, descartar bytes como este solo produce datos basura con un conjunto aleatorio de bytes faltantes. Al producir retrasos, solo puede obtener el búfer lleno de algunos bytes de la siguiente transmisión. Y se bloquea, lo que sea que hagas con los datos corruptos es probable que caiga mal.
Debes eliminar esa declaración.
Estoy hablando de la programación C # y me comunico con el puerto serial y los diferentes resultados en Windows 7 y XP. mi código es:
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();
}
}
este programa funciona bien en Windows XP, pero cuando lo intento en Windows 7, es lento, obtiene datos incorrectos y después de un poco de dejar de funcionar.
Escribí este programa nuevamente en Windows 7 y XP y lo probé con visual studio 2008 y 2012, pero obtuve los mismos resultados.