我的代码有问题。代码应该从机器人类型构建一个对象列表。每个机器人都应该包含一个串口和一个名称(以后可能会有更多的属性)。但在这一点上,我不明白,为什么任何机器人都有相同的名称 - 系统中最后一个可用的 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
}
};