0

我尝试使用 gcc(我使用 mac)通过串行端口访问机器人。

我已经让我的程序发送简单的命令:

HOME(回车),机器人有一些反馈:这是
归位序列命令。机器人将在每个轴上寻找其归位开关
,并将在该位置执行归位功能。你
想继续吗(是/否)?

我发送

Y(输入)

机器人假设移动。

现在访问机器人是使用调制解调器/终端 Zterm。此调制解调器使用波特率 38400、8N1

我使用相同的波特率和 8n1

这是我的代码,我不知道为什么我的代码不能让机器人移动

谢谢

丹尼尔

    #include<stdio.h>   /* Standard input/output definitions */
    #include<stdlib.h>
    #include<string.h>  /* String function definitions */
    #include<unistd.h>  /* UNIX standard function definitions */
    #include<fcntl.h>   /* File control definitions */
    #include<errno.h>   /* Error number definitions */
    #include<termios.h> /* POSIX terminal control definitions */
    //#include<conio.h> 

    /*
     * 'open_port()' - Open serial port 1.
     *
     * Returns the file descriptor on success or -1 on error.
     */

    int buf_size;
    char *buf;
    char *buff;
    int fd; /* File descriptor for the port */

    int open_port(void)
    {

       fd = open("/dev/tty.USA28X1a2P2.2", O_RDWR | O_NOCTTY | O_NDELAY);  //      USA28X1a2P2.for keyspan 
    //fd = open("/dev/ttys000", O_RDWR | O_NOCTTY | O_NDELAY);   
    if (fd == -1) {
     /*
      * Could not open the port.
      */
      perror("cannot open");
   }
     else 
        fcntl(fd, F_SETFL, 0);
        struct termios options;
          /* 
           * Get the current options for the port...
           */
          tcgetattr(fd, &options);

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

         cfsetispeed(&options, B38400);
         cfsetospeed(&options, B38400);


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

         options.c_cflag |= (CLOCAL | CREAD);

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

         tcsetattr(fd, TCSANOW, &options);

         options.c_cflag &= ~CSIZE; /* Mask the character size bits */

         options.c_cflag &= ~PARENB;
         options.c_cflag &= ~CSTOPB;
         options.c_cflag &= ~CSIZE;
         options.c_cflag |= CS8;

     return (fd);
    }

    int main(int argc, char**argv) {
        buf =malloc(20);
        buff=malloc(20);

    //   strcpy(buf,"HOME");
    //    strcpy(buff,"Y");
        open_port();
        printf("type the command using Capital Letter : \n");
        scanf("%s",buf);
        write(fd, buf,20); // 
        write(fd," \r ",5);
        printf("Command = %s\n", buf);
        read(fd, buff,50);
        printf(" %s \n",buff);
        free(buf);
        free(buff);
        printf("type Y/N : \n");
        scanf("%s",buf);
        write(fd, buf,2);
        write(fd,"\r",2);

    //    free(buf);
    //  free (buff);
    //    printf("type Y/N : \n");
    //    write(fd, buf,20);
    //    printf("You choose %s \n",buff);
    //    free(buf);

        close(fd);
    }
4

2 回答 2

1

你一次阅读太多。您将缓冲区分配为 20 个字节,buff=malloc(20);但在这里您读取的是 50个字节,read(fd, buff,50);这充其量会导致奇怪的行为。确保分配尽可能多的空间。你甚至不需要分配它,你可以使用一个数组。

char buf[1024];
char buff[1024];

然后在再次使用它们之前释放你的内存。

 free(buf);
 free(buff);
 printf("type Y/N : \n");
 scanf("%s",buf);

在调用之前不要释放 buf 或 buff close(fd)

也阅读良好的 C 风格。您正在做一些不是错误的事情,但以后会让您的生活更加艰难。

于 2012-11-09T05:52:47.310 回答
0

代码中有很多错误(如缓冲区溢出等),但我能发现的最明显的错误在这里:

tcsetattr(fd, TCSANOW, &options);

options.c_cflag &= ~CSIZE; /* Mask the character size bits */

options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

只有在您已经使用它来设置文件描述符的属性之后,您才options可以设置结构的字段。您必须将调用置于整个序列的末尾:tcsetattr()

options.c_cflag &= ~CSIZE; /* Mask the character size bits */
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

tcsetattr(fd, TCSANOW, &options);

如果您不想自己手动设置所有这些,请尝试我的辅助功能。

于 2012-11-09T05:52:34.143 回答