2011-01-07 19 views
0

设置不同的我在我的代码中的问题。代码应该从类型机器人构建一个对象列表。每个机器人应该包括一个串口和一个名字(也许后面会有更多的属性)。 但在这一点上,我不明白,为什么任何机器人获得相同的名称 - 系统中可用的最后一个com端口的名称。财产目录euqals的每个对象上,但它应该在一个循环

所以,谁能告诉我,为什么? (几乎在// TBD-mark结尾处) ,请随时发表评论或更正其他内容。我知道,这是很多膨胀,也许部分不是最好的代码。

所以,提前谢谢你。

#define debug_enabled 0 
#define exampleclass_enabled 0 

#using <System.dll> 

using namespace System; 
using namespace System::IO::Ports; 
using namespace System::Threading; 
using namespace System::Collections::Generic; 
using namespace System::Timers; 


public ref class Robot { 
private: static String^ _name; 
     static bool _active; 

public: 
    property String^ name 
    { 
     String^ get(){return _name;} 
     void set (String^ newname) {_name = newname;} } 
    static SerialPort^ port; 
// static String^ GetNameString() { return _name;} 
    static bool IsActive() {return _active;} 
// static String^ SetName(String^ name) { _name->Copy(name);return _name;} 
    static bool SetActive(bool active) { _active = active; return _active;} 

}; 
public ref class CommunicatorClass 
{ 
private: 
     static System::Timers::Timer^ aTimer; 
     static array<String^,2>^ commandList = gcnew array<String^,2>(6,2); 


public: 
    static List<Robot^>^ _serialPortList = gcnew List<Robot^>(); 
    static int baudRate = 9600; 
    static int dataBits = 8; 
    static System::IO::Ports::StopBits stopBits = System::IO::Ports::StopBits::One; 
    static System::IO::Ports::Parity parity = System::IO::Ports::Parity::None; 
// void Main(); /*initialisation of the Com-Ports*/ 
    static bool SendCommand(String^ command){ 
     //search in defined commandlist for command to send, if match, send int, if not set int to last default position(start) to wait for start as response 
     int commandInArray; 

     for(int i=0; i<commandList->Rank; i++) 
      for (int j=0;j<1;j++) { //it doesnt care, if the command is the number or the word for it that equals the response 
      if(command->Contains(commandList[i,0])) 
       commandInArray = i; 
      else 
       commandInArray = commandList->Rank; 
      } 


     for each (Robot^ s in _serialPortList) 
     { 
      if (s->IsActive()){ 
       if (!s->port->IsOpen){ 
        s->port->Open(); 
       } 

       try 
        { 

         s->port->DiscardInBuffer(); 
         s->port->WriteLine(commandList[commandInArray,0]); 
         bool _temp = 0; 


         aTimer = gcnew System::Timers::Timer(10000); 

         // Set the Interval to 500 mseconds. 
         aTimer->Interval = 500; 
         aTimer->Enabled = true; 

         do 
         {if (s->port->ReadLine()->Contains(commandList[commandInArray,1])) _temp = 1; // and in code of robot: /n after each line! 
         if (aTimer->Interval == 0) { 
          _temp = 1; 
          throw gcnew TimeoutException("Timeout on sending command to Robot - no response."); 
          } 
         } 
         while (_temp == 1); 

         } 
      catch (TimeoutException ^) { 
      return 0;} 

       } 
      } 

     return 1; 
    } /*sends the specified command to each robot marked active*/ 
    static bool refresh(){ 
     _serialPortList->Clear(); 
     CommunicatorClass::Main(); 
     return 1; 
    } 
    static void Main(){ 
     //initialize commands [*,0] and responses [*,1] in array 
     commandList[0,0] = "8"; 
     commandList[0,1] = "Vor"; 
     commandList[1,0] = "6"; 
     commandList[1,1] = "Links"; 
     commandList[2,0] = "7"; 
     commandList[2,1] = "Zurueck"; 
     commandList[3,0] = "4"; 
     commandList[3,1] = "Rechts"; 
     commandList[4,0] = "5"; 
     commandList[4,1] = "Stop"; 
     commandList[5,0] = ""; 
     commandList[5,1] = "Start"; 


//   _serialPortList->Initialize; 
     for each (String^ s in SerialPort::GetPortNames()) 
     { 
#if debug_enabled 
      Console::WriteLine(" {0}", s); 
#endif 

      Robot^ temp = gcnew Robot(); 
      temp->port = gcnew SerialPort(s,baudRate,parity,dataBits,stopBits); 
      //temp->SetName(s); 
      temp->name = s; 
      _serialPortList->Add(temp); //TBD::error in dereferianciation ?! 


     } 
#if debug_enabled 
     for each (Robot^ s in _serialPortList) 
     { 
      Console::WriteLine(" {0}", s->name); 
     } 
#endif 
    } 

}; 

回答

0
public ref class Robot { 
private: static String^ _name; 
     static bool _active; 

public: 
    property String^ name 
    { 
     String^ get(){return _name;} 
     void set (String^ newname) {_name = newname;} 
    } 
    static SerialPort^ port; 
// static String^ GetNameString() { return _name;} 
    static bool IsActive() {return _active;} 
// static String^ SetName(String^ name) { _name->Copy(name);return _name;} 
    static bool SetActive(bool active) { _active = active; return _active;} 
}; 

在你的类定义的机器人,你就定义为静态的一切。这意味着它将在该类的所有实例之间共享,并且可以作为Robot::SerialPort访问,而不是需要Robot的实例,如Robot^ r; r->SerialPort

交换机的所有那些是非静态的,而且我认为会解决你的问题。

+0

太好了,谢谢! – nico 2011-01-12 22:16:58

相关问题