2012-02-17 2 views
2

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

Я был успешным в этом; однако, после запуска приложения в течение пары минут он вешает трубку.

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

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

Большое спасибо заранее за вашу помощь.

+0

Попробуйте использовать portmon, чтобы узнать, какие данные отправляются. Это ошибка, потому что устройство перестает отправлять данные или что-то в вашем приложении. Также почему вы используете таймер, а затем также спать в этой теме? – SamFisher83

+0

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

+0

Сэм, спасибо за ваш комментарий. Я попробую то, что вы сказали, и, надеюсь, выясните, что происходит. – user1217173

ответ

1

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

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

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

+0

+1, спать в таймере, это плохая идея. – user7116

0

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

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

Смежные вопросы