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
}
};
großartig, danke! – nico