列表中每个对象的属性 euqals,但应该在循环中设置不同
我的代码有问题。 代码应该从 robots.txt 类型构建一个对象列表。每个机器人应该包括一个串行端口和一个名称(也许稍后还有更多属性)。 但此时,我不明白为什么任何机器人都会获得相同的名称 - 系统中最后一个可用的 com 端口的名称。
那么,谁能告诉我,为什么? (几乎在 //TBD 标记的末尾) 并且,请随意发表评论或更正其余部分。我知道,它非常臃肿,而且可能部分不是最好的代码。
所以,提前谢谢你。
#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
}
};
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
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 Robot 的类定义中,所有内容都定义为静态。这意味着它将在该类的所有实例之间共享,并且可以作为
Robot::SerialPort
进行访问,而不需要像Robot^ r; 这样的 Robot 实例; r->串行端口
。将所有这些切换为非静态,我认为这会解决您的问题。
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, likeRobot^ r; r->SerialPort
.Switch all those to be non-static, and I think that'll solve your problem.