我在visual studio 2012 c ++中创建了一个应用程序。我们的想法是从串口读取数据并相应地改变标签的颜色。我使用while循环以连续的方式改变颜色。现在,应用程序运行正常。我面临的问题是当我点击应用程序中的退出按钮或“x”按钮时应用程序不存在。我只能通过单击结束任务才能在任务管理器中关闭。以下是我的申请代码。请告诉我有没有办法解决这个问题
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 :(得分:2)
如果您进行UI编程,则必须使用事件驱动机制!在您的情况下,您应该注册“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();
}
}
另外我建议将“read theresehold”设置为4 ...
serialPort1->ReceivedBytesThreshold = 4;