我正在尝试将安全系统作为我的微控制器术语项目的一部分来实现。我几乎完成了软件的结束。我只需要设计一个GUI作为我的安全系统的指示器或报警设备。微控制器利用传感电路检查系统是否已被破坏,并将报警信号串行发送到PC。我正在使用C ++从PC串口读取数据,整个过程非常有效。但是,我是在基于控制台的环境中进行的。这就是我所知道的。我正在学习成为一名电子工程师。 :P
然而,这是不可接受的,我需要为我的项目设计一个GUI。
问题1: 无论如何,我可以将我现有的代码与GUI集成吗?我已经google了这个没有太多运气。所有的答案似乎都指向像Qt等外部库的方向。这有点可怕,因为我没有很多时间。
问题2: 正如我前面提到的那样,我有点害怕必须使用外部库等等。所以我尝试使用基于Visual C ++的Windows窗体应用程序在Visual Studio上创建GUI。我使用了Toolbox中的serialport实用程序。我无法以这种方式从COM端口读取数据,但我可以将数据写入其中。
这就是表格的样子:
我正在尝试显示从文本框上的串行端口读取的数据,以响应按下按钮。这是我用于按钮的代码:
private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e)
{}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
this->serialPort1->PortName = "COM1";
this->serialPort1->Open();
this->serialPort1->BaudRate = 9600;
try
{
this->textBox1->Text=this->serialPort1->ReadLine();
}
catch(TimeoutException^)
{
this->textBox1->Text="Timeout Exception";
}
this->serialPort1->Close();
你能告诉我我做错了什么吗?我是新来的。这是我的首选方法,顺便说一句。
答案 0 :(得分:0)
如果您不想使用外部库,那么使用Windows窗体绝对是可行的方法,我也是这样做的。
我并不完全是这些事情,但仅使用ReadLine()
可能是问题的可能来源。也许通过串口传入的数据不仅仅通过一行发送。也许你必须循环输入,继续使用ReadLine()
并收集数组中的行,直到收到所有数据。
但是也许还有另一个命令,比如ReadAllLines()
,它会立即读取所有输入并将它返回给你?
答案 1 :(得分:0)
我的直接怀疑是ReadLine()命令 - 你确定你的MC正在写终结字符吗?
使用ReadFile,看看你是否可以读取单个字节。如果没有,那么您可能需要调整更多选项。如果遇到超时异常,则需要调整读取超时(SetCommTimeouts)。
Allen Denver在这里很好地描述了你需要的一切:http://msdn.microsoft.com/en-us/library/ff802693.aspx
对于哪个GUI,如果您使用的任何Windows窗体项目都有效,那么请坚持使用它。我个人使用MFC进行类似的最后一年项目,但那是因为我已经熟悉了它。
下次虽然学习C#。 C#和Java在创建GUI方面更加容易和快捷。
答案 2 :(得分:0)
至于你的问题1,我建议你使用MFC库,这很容易。这是一个很好的例子,你可以开始。 http://depts.washington.edu/cmmr/biga/chapter_tutorials/1.C++_MFC_D3DOGL/1.StepByStepGuide/index.html
根据我的理解,您已经能够在基于控制台的环境中读取和写入数据。 GUI仅用于输入或显示数据。在这种情况下,您可以轻松编写MFC项目,以满足您的需要。
对于第二个问题,如果您尝试在编辑框中显示从串口读取的数据,以响应按下按钮。您应该首先向编辑框添加变量,例如edit_box_value
。在该按钮单击功能中,实现如下代码:
edit_box_value.Format(_T("%s"), data_to_be_displayed);
UpdateData(FALSE);