2011-01-07 11 views
0

Ich habe ein Problem in meinem Code. Der Code sollte eine Liste von Objekten vom Typ Roboter erstellen. jeder Roboter sollte einen seriellen Port und einen Namen (vielleicht später noch einige Attribute) enthalten. aber an diesem Punkt verstehe ich nicht, warum jeder Roboter den gleichen Namen bekommt - der Name des letzten im System verfügbaren Com-Ports.Eigenschaft auf jedem Objekt einer Liste euqals, aber es sollte in einer Schleife anders eingestellt werden

also, kann mir jemand sagen, warum? (fast am Ende am // TBD-Zeichen) und, bitte zögern Sie nicht, den Rest auch zu kommentieren oder zu korrigieren. Ich weiß, es ist viele Blähungen und vielleicht teilweise nicht der beste Code.

also, danke im voraus.

#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 
    } 

}; 

Antwort

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;} 
}; 

In Ihrer Klassendefinition für Roboter, haben Sie alles, was als statisch definiert bekommen. Dies bedeutet, dass es zwischen allen Instanzen dieser Klasse geteilt wird und auf Robot::SerialPort zugegriffen werden kann, anstatt eine Instanz von Robot zu benötigen, wie Robot^ r; r->SerialPort.

Schalten Sie alle diese, um nicht-statische zu sein, und ich denke, das wird Ihr Problem lösen.

+0

großartig, danke! – nico