C# 串行端口数据接收事件处理程序的可靠性
我正在使用C#中的串行端口功能与硬件进行通信。所有内容都可以很好地写入串行端口,并且串行端口始终处于连接状态 由于某些原因,串行端口数据接收处理程序并不总是读取即将出现的数据(每8次中有1次无法读取任何内容或调用事件函数本身)。另一边一切都很好。我只收到一封来自串口的信,它是1、2、3等等 这是我的密码: 串行设置:C# 串行端口数据接收事件处理程序的可靠性,c#,serialization,C#,Serialization,我正在使用C#中的串行端口功能与硬件进行通信。所有内容都可以很好地写入串行端口,并且串行端口始终处于连接状态 由于某些原因,串行端口数据接收处理程序并不总是读取即将出现的数据(每8次中有1次无法读取任何内容或调用事件函数本身)。另一边一切都很好。我只收到一封来自串口的信,它是1、2、3等等 这是我的密码: 串行设置: //Create new serial port SerialPort SerPort = new SerialPort("COM4"); private
//Create new serial port
SerialPort SerPort = new SerialPort("COM4");
private void SetupSerial()
{
SerPort.BaudRate = 9600;
SerPort.Parity = Parity.None;
SerPort.StopBits = StopBits.One;
SerPort.DataBits = 8;
SerPort.Handshake = Handshake.None;
SerPort.ReadTimeout = 4000;
SerPort.WriteTimeout = 6000;
SerPort.Open();
SerPort.DataReceived += new SerialDataReceivedEventHandler(HandleSerialData);
lblStatus.Text = "Successfully connected to COM port with no errors!";
}
我的串行写入功能:
private void WriteToSerial( string data )
{
byte[] MyMessage = Encoding.UTF8.GetBytes(data);
SerPort.Write(MyMessage, 0, MyMessage.Length);
string time = "[" + DateTime.Now.ToString("HH:mm") + "]";
bool debug = chkDebug.Checked;
if (debug ) f.DebugText = time + " Wrote bytes to serial: " + data;
}
//Called everytime serial data is recieved
private void HandleSerialData(object sender, SerialDataReceivedEventArgs e)
{
try
{
//Store recieved data in variable
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting().ToString();
bool debug = chkDebug.Checked;
string time = "[" + DateTime.Now.ToString("HH:mm") + "]";
if( debug ) f.DebugText = time + " Recieved serial data: " + data;
switch ( data )
{
case "1":
//If Battery is already on
if( Battery1[0] == "ON")
{
Battery1[0] = "OFF"; //ON or OFF
Battery1[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("1");
lblST1.Text = "n/a";
lblET1.Text = "n/a";
if (debug) f.DebugText = time + " Battery 1 testing switched OFF.";
}
else
{
Battery1[0] = "ON"; //ON or OFF
Battery1[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery1[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST1.Text = Battery1[1];
if (debug) f.DebugText = time + " Battery 1 testing switched ON.";
}
break;
case "2":
//If Battery is already on
if (Battery2[0] == "ON")
{
Battery2[0] = "OFF";
Battery2[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("2");
lblST2.Text = "n/a";
lblET2.Text = "n/a";
if (debug) f.DebugText = time + " Battery 2 testing switched OFF.";
}
else
{
Battery2[0] = "ON"; //ON or OFF
Battery2[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery2[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST2.Text = Battery2[1];
if (debug) f.DebugText = time + " Battery 2 testing switched ON.";
}
break;
case "3":
//If Battery is already on
if (Battery3[0] == "ON")
{
Battery3[0] = "OFF"; //ON or OFF
Battery3[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("3");
lblST3.Text = "n/a";
lblET3.Text = "n/a";
if (debug) f.DebugText = time + " Battery 3 testing switched OFF.";
}
else
{
Battery3[0] = "ON"; //ON or OFF
Battery3[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery3[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST3.Text = Battery3[1];
if (debug) f.DebugText = time + " Battery 3 testing switched ON.";
}
break;
case "4":
//If Battery is already on
if (Battery4[0] == "ON")
{
Battery4[0] = "OFF"; //ON or OFF
Battery4[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("4");
lblST4.Text = "n/a";
lblET4.Text = "n/a";
if (debug) f.DebugText = time + " Battery 4 testing switched OFF.";
}
else
{
Battery4[0] = "ON"; //ON or OFF
Battery4[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery4[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST4.Text = Battery4[1];
if (debug) f.DebugText = time + " Battery 4 testing switched ON.";
}
break;
case "5":
//If Battery is already on
if (Battery5[0] == "ON")
{
Battery5[0] = "OFF"; //ON or OFF
Battery5[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("5");
lblST5.Text = "n/a";
lblET5.Text = "n/a";
if (debug) f.DebugText = time + " Battery 5 testing switched OFF.";
}
else
{
Battery5[0] = "ON"; //ON or OFF
Battery5[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery5[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST5.Text = Battery5[1];
if (debug) f.DebugText = time + " Battery 5 testing switched ON.";
}
break;
case "6":
//If Battery is already on
if (Battery6[0] == "ON")
{
Battery6[0] = "OFF"; //ON or OFF
Battery6[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("6");
lblST6.Text = "n/a";
lblET6.Text = "n/a";
if (debug) f.DebugText = time + " Battery 6 testing switched OFF.";
}
else
{
Battery6[0] = "ON"; //ON or OFF
Battery6[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery6[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST6.Text = Battery6[1];
if (debug) f.DebugText = time + " Battery 6 testing switched ON.";
}
break;
}
SerPort.DiscardInBuffer();
SerPort.DiscardOutBuffer();
}
catch (Exception ex)
{
MessageBox.Show("Error recieving COM data! " + ex.Message);
}
}
我的接收事件功能:
private void WriteToSerial( string data )
{
byte[] MyMessage = Encoding.UTF8.GetBytes(data);
SerPort.Write(MyMessage, 0, MyMessage.Length);
string time = "[" + DateTime.Now.ToString("HH:mm") + "]";
bool debug = chkDebug.Checked;
if (debug ) f.DebugText = time + " Wrote bytes to serial: " + data;
}
//Called everytime serial data is recieved
private void HandleSerialData(object sender, SerialDataReceivedEventArgs e)
{
try
{
//Store recieved data in variable
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting().ToString();
bool debug = chkDebug.Checked;
string time = "[" + DateTime.Now.ToString("HH:mm") + "]";
if( debug ) f.DebugText = time + " Recieved serial data: " + data;
switch ( data )
{
case "1":
//If Battery is already on
if( Battery1[0] == "ON")
{
Battery1[0] = "OFF"; //ON or OFF
Battery1[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("1");
lblST1.Text = "n/a";
lblET1.Text = "n/a";
if (debug) f.DebugText = time + " Battery 1 testing switched OFF.";
}
else
{
Battery1[0] = "ON"; //ON or OFF
Battery1[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery1[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST1.Text = Battery1[1];
if (debug) f.DebugText = time + " Battery 1 testing switched ON.";
}
break;
case "2":
//If Battery is already on
if (Battery2[0] == "ON")
{
Battery2[0] = "OFF";
Battery2[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("2");
lblST2.Text = "n/a";
lblET2.Text = "n/a";
if (debug) f.DebugText = time + " Battery 2 testing switched OFF.";
}
else
{
Battery2[0] = "ON"; //ON or OFF
Battery2[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery2[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST2.Text = Battery2[1];
if (debug) f.DebugText = time + " Battery 2 testing switched ON.";
}
break;
case "3":
//If Battery is already on
if (Battery3[0] == "ON")
{
Battery3[0] = "OFF"; //ON or OFF
Battery3[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("3");
lblST3.Text = "n/a";
lblET3.Text = "n/a";
if (debug) f.DebugText = time + " Battery 3 testing switched OFF.";
}
else
{
Battery3[0] = "ON"; //ON or OFF
Battery3[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery3[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST3.Text = Battery3[1];
if (debug) f.DebugText = time + " Battery 3 testing switched ON.";
}
break;
case "4":
//If Battery is already on
if (Battery4[0] == "ON")
{
Battery4[0] = "OFF"; //ON or OFF
Battery4[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("4");
lblST4.Text = "n/a";
lblET4.Text = "n/a";
if (debug) f.DebugText = time + " Battery 4 testing switched OFF.";
}
else
{
Battery4[0] = "ON"; //ON or OFF
Battery4[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery4[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST4.Text = Battery4[1];
if (debug) f.DebugText = time + " Battery 4 testing switched ON.";
}
break;
case "5":
//If Battery is already on
if (Battery5[0] == "ON")
{
Battery5[0] = "OFF"; //ON or OFF
Battery5[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("5");
lblST5.Text = "n/a";
lblET5.Text = "n/a";
if (debug) f.DebugText = time + " Battery 5 testing switched OFF.";
}
else
{
Battery5[0] = "ON"; //ON or OFF
Battery5[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery5[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST5.Text = Battery5[1];
if (debug) f.DebugText = time + " Battery 5 testing switched ON.";
}
break;
case "6":
//If Battery is already on
if (Battery6[0] == "ON")
{
Battery6[0] = "OFF"; //ON or OFF
Battery6[2] = DateTime.Now.ToString("h:mm tt"); //End time
WriteLogFile("6");
lblST6.Text = "n/a";
lblET6.Text = "n/a";
if (debug) f.DebugText = time + " Battery 6 testing switched OFF.";
}
else
{
Battery6[0] = "ON"; //ON or OFF
Battery6[1] = DateTime.Now.ToString("h:mm tt"); //Start time
Battery6[5] = DateTime.Now.ToString("d/MM/yyyy"); //Start date
plcRespond = true;
lblST6.Text = Battery6[1];
if (debug) f.DebugText = time + " Battery 6 testing switched ON.";
}
break;
}
SerPort.DiscardInBuffer();
SerPort.DiscardOutBuffer();
}
catch (Exception ex)
{
MessageBox.Show("Error recieving COM data! " + ex.Message);
}
}
有没有更好的方法不使用ReadExisting读取串行数据?还是使用更可靠的功能?我过去在
ReadExisting
方面遇到过问题。我不知道在读取缓冲区时,如果有更多数据到达,ReadExisting会发生什么
在串行端口偶数处理程序中,我使用以下代码。因为它决定了首先读取的长度,所以在下一次函数调用期间将读取到达的新数据,以便以发送数据的速率清空缓冲区
private void HandleSerialData(object sender, SerialDataReceivedEventArgs e)
{
int lengthToRead = sp.BytesToRead;
byte[] rxBytes = new byte[lengthToRead];
sp.Read(rxBytes, 0, lengthToRead);
functionThatInterpratesData(rxBytes);
}
这还具有可重用的优点,因为您可以将字节数组转换为字符串,或者单独对其进行编码
我将创建一个函数来将字节数组转换为字符串(有很多例子),并创建另一个函数来处理case语句。我过去在使用
ReadExisting
时遇到过问题。我不知道在读取缓冲区时,如果有更多数据到达,ReadExisting会发生什么
在串行端口偶数处理程序中,我使用以下代码。因为它决定了首先读取的长度,所以在下一次函数调用期间将读取到达的新数据,以便以发送数据的速率清空缓冲区
private void HandleSerialData(object sender, SerialDataReceivedEventArgs e)
{
int lengthToRead = sp.BytesToRead;
byte[] rxBytes = new byte[lengthToRead];
sp.Read(rxBytes, 0, lengthToRead);
functionThatInterpratesData(rxBytes);
}
这还具有可重用的优点,因为您可以将字节数组转换为字符串,或者单独对其进行编码
我将创建一个函数来将字节数组转换为字符串(有很多例子),并创建另一个函数来处理case语句。干杯。我使用了你提供给我的方式。到目前为止,它似乎工作正常,没有遗漏任何读数。我一会儿会回来告诉你的。你过得怎么样?干杯。我使用了你提供给我的方式。到目前为止,它似乎工作正常,没有遗漏任何读数。我一会儿会回来告诉你的。你过得怎么样?