gpt4 book ai didi

c# - 多个串行端口读取仅在几分钟后挂起

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:55 24 4
gpt4 key购买 nike

我正在尝试编写一些同时从两个串行端口读取数据的代码。

我已经成功地做到了;然而,在运行该应用程序几分钟后,它挂断了。

我需要它至少运行一小时来记录足够的数据点。如果有人查看我的代码并在发现任何问题时告诉我,我将不胜感激。

// 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函数中下一个断点,然后在断点的红球上,右击。浏览上下文菜单,尤其是“点击时”-> 打印消息。

关于c# - 多个串行端口读取仅在几分钟后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9335712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com