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

本文关键字:分钟 几分钟 挂起 串行端口 读取 | 更新日期: 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函数中放置一个断点,然后在断点的红色球上右键单击。浏览上下文菜单,尤其是"点击时"->打印信息。

感谢所有为这个问题做出贡献的人。我找到了答案。事实上,两个串行端口在运行几分钟后就会超时,所以我所要做的就是设置读/写超时并处理抛出的异常。它曾经挂起,因为它要么在等待写入,要么在无限地从串行端口读取一些东西。

无论如何,我希望这个简单的错误能帮助其他人,再次感谢你的贡献。