arduinoスケッチで奇妙な問題が発生しました。 私はwhithクラスで書くことに決めましたので、かなり複雑です。 基本的には、TCP接続を介してJSON形式でデータを受信し、デコードされたデータをもとにいくつかの操作を行います。Arduino、コード実行中に変数の値を失う
ライブラリ「Arduino Json」を使用して、受信したJSONをクラス「PacketManager」内でデコードします。次に、JSONオブジェクトをクラス "Bollard"に渡してコマンドを実行します(コードが続きます)。奇妙なことに、 "CommandExecutor"メソッドの "Bollard"クラスでは、渡されたデータにアクセスすることができますが、私はそれらを使用できますが、データが0になる同じメソッドのコード中のある時点で。 Ofcourse i 'このメソッドでデータが上書きされていないことを確認しました。スケッチには割り込みやマルチスレッドはありません。変数のような割り当てられていないフォームメモリを取得するか、メモリブロックが上書きされるようです。
/// JSONオブジェクトを
commandResult* BikeBollard::commandExecute(JsonObject& incomingFrame){
unsigned int* statusResponse= new unsigned int; // CREATE STATIC POINTER
unsigned int* eventType= new unsigned int;
unsigned int* commandType= new unsigned int;
unsigned int* packetNumber= new unsigned int;
// GET DATA FORM THE JSON OBJECT
unsigned int statusResponse_volatile=(unsigned int)incomingFrame["status"];
unsigned int eventType_volatile=(unsigned int)incomingFrame["eventType"];
unsigned int commandType_volatile=(unsigned int)incomingFrame["commandType"];
unsigned int packetNumber_volatile=(unsigned int)incomingFrame["packetNumber"];
// ASSIGN TO THE STATIC POINTED VALUE
*statusResponse=statusResponse_volatile;
*eventType=eventType_volatile;
*commandType=commandType_volatile;
*packetNumber=packetNumber_volatile;
commandResult* result;
Serial.print("STATUS OF THE RESPONSE ");Serial.println(*statusResponse); // correct value
Serial.print("EVENT TYPE ");Serial.println(*eventType); // correct value
Serial.print("COMMAND TYPE ");Serial.println(*commandType); // correct value
Serial.print("PACKET NUMBER ");Serial.println(*packetNumber); // correct value
///////////////////////////// FROM HERE SOMETIMES THE VALUES *commandType AND *eventType GO TO 0 WITHOUT A REASON ///////////////////////////
if(*eventType==ACK_STANDARD_MESSAGE){ // ACK vase
Serial.print("STATUS OF THE RESPONSE ");Serial.println(*statusResponse); // correct value
*eventType=*commandType;
Serial.print("STATUS OF THE RESPONSE ");Serial.println(*statusResponse); // correct value
result->ackPriority=false;
}
result->type=*eventType;
#ifdef DEBUG_MODE
Serial.print("BOLLARD: EXECUTE COMMAND "); Serial.println(*eventType);
#endif
switch(*eventType){ // wrong value pass form the correct value to 0 sometimes
case MSG_UP:
{
Serial.println("ACK MSG_UP Received");
result=this->executeMessageUp(*eventType, *packetNumber);
break;
}
case MSG_LATCH:
{
Serial.println("ACK MSG_LATCH Received");
this->executeMessageLatch(*eventType, *packetNumber);
break;
}
case MSG_UP_OK:
{
// DO SOMETHING
break;
}
case MSG_UP_ERROR:
{
// DO SOMETHING
break;
}
case MSG_PRESENT:
{
// DO SOMETHING
break;
}
case LOGIN_MESSAGE:
{
Serial.println("NOTICE: Logged IN");
this->loggedIn=true;
break;
}
case MSG_CARD:
{
Serial.println("ACK MSG_CARD Received");
if(*statusResponse==1){
Serial.println("DO EXECUTE MSG-UP");
result=this->executeMessageUp(*eventType, *packetNumber);
}
else {
//DO SOMETHING
}
break;
}
case MSG_BOLLARD_ACTIVATION:
{
Serial.print("STATUS OF THE RESPONSE ");Serial.println(*statusResponse); // 0 ERROR *statusResponse changed it's value.
if(*statusResponse==1) {
if(!this->isActive)checkBollardStatusWaitingTime=CHECK_BOLLARD_STATUS_TIME+1; // set bolard to active
this->isActive=true;
}
else{
if(this->isActive)checkBollardStatusWaitingTime=CHECK_BOLLARD_STATUS_TIME+1; // check againg the status
this->isActive=false;
}
break;
}
default:{
Serial.print("NOT CODED EVENT "); Serial.println(*eventType);
result->type=0;
#ifdef DEBUG_MODE
Serial.println("Default Message Expired");
#endif
break;
}
}
delete statusResponse;
delete eventType;
delete commandType;
delete packetNumber;
return result;
}
を使用するクラスボラードのJSON
void PacketManager::readPacket(){
resultRead reads=socket.readSocket(); //get data from soket
if(reads.mainCounter>0){ // if data
delay(150);
StaticJsonBuffer<200> jsonBuffer; //create a static json buffer form the library ArduinoJson.h
JsonObject& incomingFrame = jsonBuffer.parseObject((char*)reads.frame); //craete a JSON oblect
delay(150);
incomingFrame.printTo(Serial); // print the Incoming JSON
Serial.println();
if(incomingFrame.success()){ // check if JSON get decoded correclty
Serial.println("JSON DECODED SUCCESSFULLY");
unsigned int eventType=incomingFrame["eventType"];
unsigned int packetNumber=incomingFrame["packetNumber"];
if(eventType==ACK_STANDARD_MESSAGE){ // ACK standard case
if(this->checkACK(packetNumber)){ // CHECK If the incoming ACK found a corrispondence with the packet sended
#ifdef DEBUG_MODE
Serial.println("ACK RECEIVED");
#endif
bollard.commandExecute(incomingFrame); // if ack is in response of a sended command execute a command form the class bollard.
}
}
................ CODE CONTINUE. THE ERROR IS ON METHOD bollard.commandExecute(incomingFrame)
/////////////// FRAGMENTを受け取るクラスPACKETMANAGER断片
誰かが助けてくれることを願っています。あなたの時間は Txです。
あなたはあなたのコード '*のeventType = * CommandTypeをの1行目に書いている;'あなたはそれが価値であることを期待.doというは 'commandType'またはその後' eventType'で指さ?また、 'eventType'に格納されている値を初期化されていないポインタを介して' commandResult'のメンバーに代入するのはなぜですか? 'commandResult * result;'と 'result-> ackPriority = false;'の間にオブジェクトの初期化はありません。実際のコードで '* eventType'ではなく' result-> type'をチェックすると、問題が発生します。あなたの返信のために、 – starturtle
Tx私はcommandResult *結果を初期化しています。 delcarationオン: [コード](構造体commandResult { 文字列メッセージ= "DEFAULT "; 文字列カード=""; BOOL sendResponse = FALSE; int型= 0; INT ackEventType; INT ackStatus; INT ackPacketNumber。 bool ackPriority = false; };) まだ問題はあると思いますか? – groot
そして、私は行のeventTypeにcommandTypeの値を割り当てる必要があります* eventType = * commandType; – groot