Problema con el control del motor paso a paso

1

Estoy enfrentando un problema extraño con mi motor paso a paso cuando intento controlarlo con mi computadora Linux.

Tan pronto como el puerto serie se abre desde mi código para hacer girar el motor paso a paso, mi terminal de comando comienza a mostrar la salida en mayúsculas y la salida que obtengo es:

  

HE ENTRADO EL PRINCIPAL LOOPSM, 500,0, -400

LECTURA: ADVERTENCIA: APAGAR LA DESCARGA DE SALIDA SAIRAM @ GTX: ~ / OPENCV / TRUNK / OPENCV / SAMPLES / C $

Después de eso, tengo que apagar el terminal e iniciar una nueva pantalla de terminal para controlar mi motor paso a paso.

También adjunto el código que habla al puerto serial de la computadora:

    void open_port(char str3[])
{  
  int fd; int n;

  struct termios options;

  /*
   * Get the current options for the port...
   */



  /*
   * Set the baud rates to 19200...
   */

  cfsetispeed(&options, B9600);
  cfsetospeed(&options, B9600);
  options.c_cflag &= ~PARENB;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS8;
  // options.c_cflag &= ~CNEW_RTSCTS;


  /*
   * Enable the receiver and set local mode...
   */



  /*
   * Set the new options for the port...
   */

  tcsetattr(fd,TCSANOW, &options);

  /* File descriptor for the port */


  fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
  if (fd == -1)
    {
      /*
       * Could not open the port.
       */

            perror("open_port: Unable to open /dev/ttyACM0 - ");
    }
  else
    fcntl(fd, F_SETFL, 0);

  //str1
  //strcpy(str1,"EM,0,0");
  strcat(str3,"\r\n");
  printf("%s\n", str3);
  n = write(fd,str3,20);
  if (n < 0)
    fputs("write() of 4 bytes failed!\n", stderr);



  close(fd);

}

No soy un experto en programación y, por lo tanto, no pude entender qué está pasando

    
pregunta Sai

3 respuestas

0

Esta es realmente una pregunta de tipo termios (y quizás por una serie de asociación): realmente no tiene ninguna relevancia para los motores paso a paso, aparte de ser un problema que surgió en el curso de hablar con una placa que sucede al conducir uno.

Lo más probable es que el programa esté ajustando la configuración de termios para el terminal además del puerto serie. Probablemente esté configurando una variedad de cosas, incluida una traducción de mayúsculas a minúsculas, como el indicador OLCUC o algo parecido.

Una solución puede ser usar tcgetattr para obtener una 'copia de respaldo' de la configuración original de termios en una estructura y luego usar tcsetattr para restaurarlos al salir.

Es posible que pueda recuperar configuraciones de terminal más comunes después de la salida del programa en su forma actual con stty, por ejemplo, 'stty sane'

    
respondido por el Chris Stratton
1

Parece que el software se volvió loco. Lo más probable es que el mensaje sea un mensaje de depuración que se olvidaron de eliminar y que no se mostró durante la prueba, ya que esa parte del código (puede ser solo dos líneas) nunca debe ejecutarse en condiciones normales. Eso también explicaría que perdiste tu comunicación.
Llamo a un error de software en el EiBotBoard.

    
respondido por el stevenvh
0

Estaba proporcionando la configuración del terminal antes de abrir el puerto. Cuando cambié el código de la siguiente manera, mi problema se resolvió:

    void open_port(char str3[])
{  
  int fd; int n;

  struct termios options;

  /*
   * Get the current options for the port...
   */

      fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);      

  /*
   * Set the baud rates to 19200...
   */

  cfsetispeed(&options, B9600);
  cfsetospeed(&options, B9600);
  options.c_cflag &= ~PARENB;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS8;
  // options.c_cflag &= ~CNEW_RTSCTS;


  /*
   * Enable the receiver and set local mode...
   */



  /*
   * Set the new options for the port...
   */



  /* File descriptor for the port */



  if (fd == -1)
    {
      /*
       * Could not open the port.
       */

            perror("open_port: Unable to open /dev/ttyACM0 - ");
    }
      else {
   tcsetattr(fd,TCSANOW, &options);
   fcntl(fd, F_SETFL, 0);
 }


    char buf[100] = {0};
    strcpy(buf,str3);
    strcat(buf,"\r\n");
    int rc = write(fd,buf,strlen(buf));

  if (rc < 0)
    fputs("write() of 4 bytes failed!\n", stderr);



  close(fd);

}

He publicado el código correcto, ya que podría ser útil para otros también

    
respondido por el Sai

Lea otras preguntas en las etiquetas