2014-02-12 3 views
-1

Я создал приложение в visual studio 2012 C++. Идея состоит в том, чтобы прочитать данные из последовательного порта и соответствующим образом изменить цвет для метки. Я использовал цикл while для непрерывного изменения цвета. Теперь приложение работает отлично. Проблема заключается в том, что приложение не существует, когда я нажимаю кнопку выхода или кнопку «x» в приложении. Я могу закрыть только в диспетчере задач, нажав на конечную задачу. Ниже приведен код моего приложения. Пожалуйста, дайте мне знать, есть ли способ исправить эту проблемупри использовании цикла while в прогаме приложение не выходит

while(checkBox1->Checked) 
     { 
      if(this->serialPort1->IsOpen) 
      { 
        int b[4] = {0}; 
        int *ptr1; 
        ptr1 = b; 
        //this->serialPort1->DiscardInBuffer(); 
        for (int i=0; i<4; i++) 
        { 
         *ptr1 = this->serialPort1->ReadChar(); 
         ptr1++; 
        } 
        int address; 
        address = ((b[0]-48)*10)+(b[1]-48); 
        System::Windows::Forms::Label^ptr; 

        switch (address) 
        { 
         case 1: ptr = label1; 
          break; 
         case 2: ptr = label2; 
          break; 
         case 3: ptr = label3; 
          break; 
         case 4: ptr = label4; 
          break; 
         case 5: ptr = label5; 
          break; 
         case 6: ptr = label6; 
          break; 
         case 7: ptr = label7; 
          break; 
         case 8: ptr = label8; 
          break; 
         default: //MessageBox::Show("Default Case"); 
          break; 
        } 
        if(b[2]=='o') 
        { 
         ptr->BackColor = Color::Red; 
         ptr->Text="R"; 
        } 
        else if(b[2]=='a') 
        { 
         ptr->Text=String::Empty; 
         ptr->BackColor = Color::Green; 
        } 
        else if(b[2]=='i') 
        { 
         ptr->Text=String::Empty; 
         ptr->BackColor = Color::Blue; 
        } 
        if ((b[3]-48)<3) 
        { 
         ptr->Text=String::Empty; 
         ptr->BackColor = Color::SaddleBrown; 
         //_sleep(5000); 
        } 
+0

ли вы указать тайм-аут чтения? Или тайм-аут по-прежнему установлен на 'InfiniteTimeout' по умолчанию? Если бесконечно, я считаю, что программа зависает в функции блокировки 'ReadChar()'. Для получения дополнительной информации см. [Свойство SerialPort.ReadTimeout] (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readtimeout%28v=vs.110%29.aspx). – sb9

+0

нет времени. Но если есть проблема с ReadChar(), приложение не будет работать правильно? Приложение может изменять цвет метки, читая последовательные данные –

+0

Нет проблем с 'ReadChar', но без блокировки« ReadChar »до тех пор, пока символ не будет доступен, что затрудняет закрытие приложения, не убивая его. Но при отладке или регистрации не должно возникнуть никаких проблем, чтобы выяснить, зависает ли программа в ReadChar или нет. – sb9

ответ

2

Если вы программирование пользовательского интерфейса, вы должны использовать механизм событий привода! В вашем случае вам необходимо зарегистрироваться на событие «DataReceived», чтобы получить вызов, если новые данные поступают из порта.

private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) 
{ 
    array<unsigned char> ^data = gcnew array<unsigned char>(4); 
    serialPort1->Read(data, 0, 4); 
    // Do whatever you want... 
} 

В обработчике события «checkBox1_CheckedChanged» вы должны просто открыть или закрыть последовательный порт!

private: System::Void checkBox1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) 
{ 
    if (checkBox1->Checked) 
    { 
     serialPort1->Open(); 
    } 
    else 
    { 
     serialPort1->Close(); 
    } 
} 

Кроме того, я предлагаю, чтобы установить "прочитать theresehold" 4 ...

serialPort1->ReceivedBytesThreshold = 4; 
Смежные вопросы