Question

I have a problem in my code. the code should build a list of objects from the type robot. each robot should include a serial port and a name (maybe later some more atributes). but at this point, i dont understand, why any robot gets the same name - the name of the last com-port available in the system.

so, can anyone tell me, why ? (nearly at the end on //TBD-mark) and, please feel free to comment or correct the rest also. i know, it is many bloat and maybe partitially not the best code.

so, thank you in advance.

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

};
Was it helpful?

Solution

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 your class definition for Robot, you've got everything defined as static. This means it will be shared between all instances of that class, and can be accessed as Robot::SerialPort, instead of requiring an instance of Robot, like Robot^ r; r->SerialPort.

Switch all those to be non-static, and I think that'll solve your problem.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top