0

10 個のDynamixelサーボ モーター (ID、位置、角度、負荷トルク)から情報を取得し、それらを画面に出力し、ログ ファイル (watchdog_log.txt) に書き込む C コードを実行しています。

#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
#include <unistd.h>
#include <string.h>
#include <dynamixel.h>
#include <math.h>
#include <dynamixelAX.h>
#include "utils_v2.h"
#include "low_level_v2AX.h"
#include "low_level_v2.h"


// Control table address
#define P_GOAL_POSITION_L       30
#define P_GOAL_POSITION_H       31
#define P_PRESENT_POSITION_L    36
#define P_PRESENT_POSITION_H    37
#define P_MOVING                46


// Defulat setting
#define DEFAULT_BAUDNUM         34 // 1Mbps
#define DEFAULT_BAUDNUM_AX  1
#define DEFAULT_ID              1


int main()
{
  FILE *fp;

  /* Get actuator ID from command line argument */
  int baudnum = 34;
  int baudnum_AX = 1;
  int deviceIndex = 0;
  int deviceIndex_AX = 1;
  int current;
  float load, angle;

  int i=0;
  int MOTOR_CHAIN[13]={-1,1,1,0,0,0,-1,1,1,0,0,0,-1};
  int MOTOR_CHAIN_AX[18]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; 
  int MOTOR_HOME[13]={404,444,3216,2037,2289,512,860,661,879,3474,1747,512};  //0, 6 and 12 are dummy
  int MOTOR_HOME_AX[18]={512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,};

  char report[1000];
  char buffer[50];


  strcpy(report,"***********\n");

  /* Initialise Open USB2Dynamixel */
  if( dxl_initialize(deviceIndex, baudnum) == 0 )
    {
      printf( "Failed to open USB2Dynamixel!-chain'0'\n" );
      printf( "Press Enter key to terminate...\n" );

    }
  else
    printf( "Successfully opened USB2Dynamixel 0!\n" );

 if( dxl_initializeAX(deviceIndex_AX, baudnum_AX) == 0 )
    {
      printf( "Failed to open USB2Dynamixel!-chain'1'\n" );
      printf( "Press Enter key to terminate...\n" );
    }
  else
    printf( "Successfully opened USB2Dynamixel 1!\n" );


  /*  Ping all devices */
  printf("Pinging devices...");

  for( i=0; i<=12; i++)
  {
    dxl_ping(i);

   if (dxl_get_result() == COMM_RXSUCCESS)
   { 
    current = (fabs(dxl_read_word(i, 0x34)-512)*10);
    load = dxl_read_word(i, 0x28);
    if (load>=1024)
    load=(load-1024)*0.1;
    else load=load*0.1;

    int theta = dxl_read_word(i, 36);
    angle = counttoangle(MOTOR_CHAIN[i], MOTOR_HOME[i], theta);
    printf("ID: %d success,      Load:  %3.1f,       Count =  %d,     Angle =   %3.2f\n", i, load, theta, angle) ;
    sprintf(buffer,"ID: %d success,      Load:  %3.1f,       Count =  %d,     Angle =   %3.2f\n",i, load, theta, angle);
    strcat(report,buffer);

   }
  else printf("ID: %d failure\n",i);
 }


//File operations
strcat(report,"***********\n\n\n");

fp = fopen("watchdog_log.txt","w"); /* append file (add text to a file or create a file if it does not exist.*/ 
fprintf(fp,"%s",report); /*writes to file*/
fclose(fp); /*done!*/** 

 /* Close device */
  dxl_terminateAX();
  return 0;
  }

画面上のコードの出力を常に監視するために、Ubuntuで「watch」コマンドを使用して1秒ごとにコードを実行しています。

watch -n 1 ./watchdog

ファイル操作が行われていない場合、端末の出力は正常です。しかし、ファイルの書き込みが完了すると、ターミナルは奇妙な出力を出します:

通常出力 通常出力

奇妙な出力 奇妙な出力

上記の問題に関するヘルプをいただければ幸いです。

4

1 に答える 1

0

一見したところ、問題は変数にあります。 char report[1000]; char buffer[50];

あなたが彼らと一緒に働いているとき、彼らはあふれています。たとえば sprintf(buffer,"ID: %d success, Load: %3.1f, Count = %d, Angle = %3.2f\n",i, load, theta, angle); 、文字列の最小サイズが 50 バイトを超えています。したがって、文字列変数のサイズを増やしたり、必要なサイズを計算してヒープに割り当てたりすることができます...

于 2012-08-21T21:26:50.760 に答える