Eigenschaft für jedes Objekt einer Liste gleich, aber es sollte in einer Schleife unterschiedlich eingestellt wird
-
30-09-2019 - |
Frage
habe ich ein Problem in meinem Code. der Code sollte eine Liste von Objekten aus dem Typ Roboter bauen. jeder Roboter sollte eine serielle Schnittstelle und einen Namen (vielleicht später einige weitere atributes) umfassen. aber an diesem Punkt, ich verstehe nicht, warum jeder Roboter den gleichen Namen bekommt -. den Namen des letzten COM-Port im System verfügbar
so kann mir jemand sagen, warum? (Fast am Ende auf // TBD Zeichen) und Sie fühlen sich frei, den Rest auch zu kommentieren oder zu korrigieren. Ich weiß, es viele aufblasen und vielleicht partitially nicht der beste Code ist.
so, 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
}
};
Lösung
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. Dieses Mittel wird es zwischen allen Instanzen dieser Klasse geteilt werden und kann als Robot::SerialPort
zugegriffen werden, statt erfordern eine Instanz von Roboter, wie Robot^ r; r->SerialPort
.
Schalten Sie alle, die nicht statisch zu sein, und ich denke, dass Ihr Problem lösen werden.