多个串行端口读取仅在几分钟后挂起
本文关键字:分钟 几分钟 挂起 串行端口 读取 | 更新日期: 2023-09-27 18:25:04
我正在尝试编写一些代码,以便同时从两个串行端口读取数据。
我成功地做到了这一点;但是,在运行应用程序几分钟后,它就挂断了。
我需要它运行至少一个小时来记录足够的数据点。如果有人看一看我的代码,如果他们发现任何问题,我将不胜感激。
// Timer to get the data every half a second.
private void timer1_Tick(object sender, EventArgs e)
{
if (!Torque_serialport.IsOpen)
{
Torque_serialport.PortName = Torque_com_name;
Torque_serialport.BaudRate = Torque_baud_rate;
Torque_serialport.DataBits = Convert.ToInt32(Torque_data_bits);
Torque_serialport.Parity = Parity.None;
Torque_serialport.StopBits = StopBits.One;
Torque_serialport.Handshake = Handshake.XOnXOff;
}
if (!Torque_serialport.IsOpen) { Torque_serialport.Open(); }
// * Initializing Temperature Sensor and Checking Whether its Open or Not. If open, nothing is done. If close, open it.
if (!Temp_serialport.IsOpen)
{
Temp_serialport.PortName = Temp_com_name;
Temp_serialport.BaudRate = Temp_baud_rate;
Temp_serialport.DataBits = Convert.ToInt32(Temp_data_bits);
Temp_serialport.Parity = Parity.None;
Temp_serialport.StopBits = StopBits.One;
Temp_serialport.Handshake = Handshake.None;
}
if (!Temp_serialport.IsOpen) { Temp_serialport.Open(); }
Read_Data();
}
发生数据读取的Read_Data函数:
public void Read_Data()
{
// * Tell Torque Readout Device to switch to Instantaneous Readings Mode (sending S0)
byte[] Send_S0 = { 0x53, 0x30, 0x0D };
Torque_serialport.Write(Send_S0, 0, 3);
// * Initializing Reading Buffer and Necessary Variables for Storing Read Values.
byte[] read_buffer = new byte[8];
int bytesread = 0;
int offset = 0;
double Torque_Reading;
double Temp_Reading;
string Temp_reading_string;
DateTime Time_Stamp;
//int Grid_row_index = 0;
byte[] Send_Xon = { 0x11, 0x0D };
byte[] Send_Xoff = { 0x13, 0x0D };
byte[] Send_TempStart = { 0x3F, 0x54, 0x0D };
string[] Tabular_Data = new string[] { "", "", "" };
Torque_serialport.Write(Send_Xon, 0, 2);
while (offset < 8)
{
bytesread = Torque_serialport.Read(read_buffer, offset, 8 - offset);
offset = offset + bytesread;
if (read_buffer[7] == 0x0A)
{
Torque_serialport.Write(Send_Xoff, 0, 2);
offset = 0;
break;
}
}
Time_Stamp = DateTime.Now;
Temp_serialport.Write(Send_TempStart, 0, 3);
Temp_reading_string = Temp_serialport.ReadExisting();
if (Temp_reading_string != "")
{
Temp_Reading = double.Parse(Temp_reading_string.Substring(2, 6));
Torque_Reading = Calculate_Torque(read_buffer);
}
// Reset Variables
offset = 0;
for (int k = 0; k < 8; k++)
{
read_buffer[k] = 0;
}
// Delay System by 1 Seconds.
System.Threading.Thread.Sleep(1000);
this.Refresh();
}
事先非常感谢你的帮助。
您基本上是在您的计时器刻度函数中睡觉。坏主意。
也不清楚你在this.Refresh()
中做了什么。根据您设置计时器的方式,可能需要也可能不需要告诉它您是否希望滴答声继续(显然您得到了多个数据点(?)。
在Visual Studio中,有一些功能可以让断点在被击中时执行不同的操作。所以在tick函数中放置一个断点,然后在断点的红色球上右键单击。浏览上下文菜单,尤其是"点击时"->打印信息。
感谢所有为这个问题做出贡献的人。我找到了答案。事实上,两个串行端口在运行几分钟后就会超时,所以我所要做的就是设置读/写超时并处理抛出的异常。它曾经挂起,因为它要么在等待写入,要么在无限地从串行端口读取一些东西。
无论如何,我希望这个简单的错误能帮助其他人,再次感谢你的贡献。