Несколько считываний последовательного порта зависают через несколько минут - PullRequest
2 голосов
/ 18 февраля 2012

Я пытаюсь написать код, который считывает данные с двух последовательных портов одновременно.

Мне это удалось;однако после запуска приложения в течение нескольких минут оно зависает.

Мне нужно, чтобы оно работало не менее часа, чтобы записать достаточно точек данных.Я был бы очень признателен, если бы кто-нибудь взглянул на мой код и дал мне знать, если увидит какие-либо проблемы.

// 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 ]

1 голос
/ 18 февраля 2012

Вы по сути спите в своей функции таймера. Плохая идея.

Также не ясно, что вы делаете в вашем this.Refresh(). В зависимости от того, как вы настроили таймер, может потребоваться или не потребоваться указать, хотите ли вы, чтобы тики продолжались (очевидно, вы получаете более одной точки данных (?).

В Visual Studio есть функциональные возможности, чтобы точки останова делали разные вещи при их попадании. Итак, установите точку останова в функции «галочка», затем на красный шар точки останова, щелкните правой кнопкой мыши. Изучите это контекстное меню, особенно «при нажатии» -> Распечатать сообщение.

0 голосов
/ 22 февраля 2012

Спасибо всем, кто внес свой вклад в этот вопрос. Я нашел ответ. Это был факт, что два последовательных порта истекли бы через пару минут работы, так что все, что мне нужно было сделать, это установить таймаут чтения / записи и обработать исключения, которые были выброшены. Раньше он зависал, потому что либо ожидал записи, либо читал что-то из последовательных портов бесконечно.

Во всяком случае, я надеюсь, что эта простая ошибка поможет другим людям, и еще раз спасибо за ваш вклад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...