仅几分钟后,多个串行端口读取就会挂起

时间:2012-02-17 21:32:22

标签: c# .net serial-port

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

我成功了;然而,在运行应用程序几分钟后,它就会挂断。

我需要它至少运行一小时来记录足够的数据点。如果有人看看我的代码并让他知道他们是否看到任何问题,我将非常感激。

// 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();
}

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你基本上睡觉了你的计时器滴答功能。不好的主意。

还不清楚你在this.Refresh()中做了什么。根据您设置计时器的方式,如果您希望刻度线继续显示,可能需要或不需要告知它(显然您获得了多个数据点(?)。

在Visual Studio中,有一些功能可以让断点在命中时执行不同的操作。所以在tick函数中放置一个断点,然后在断点的红球上右键单击。探索上下文菜单,尤其是“点击时” - &gt;打印一条消息。

答案 1 :(得分:0)

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

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