写入然后读取到C中的串行端口

时间:2015-07-21 22:30:14

标签: c linux serial-port read-write

我有一个连接到/dev/ttyUSB0的USB到串行适配器,它连接到一个旋转阶段。我只需通过串口发送ASCII命令即可与该旋转阶段进行通信。即只是要求该轮换阶段的当前位置:

    窗口1中的
  1. echo -e "1tp\r" > /dev/ttyUSB
  2. 窗口2中的
  3. cat /dev/ttyUSB返回当前位置:“1TP-0.00000”
  4. 现在我希望能够在C程序中的某个触发器上完成此操作。

    我浏览了这个惊人的档案,并找到了一些如何完成它的例子。例如

    基于这些,我写了这个非常丑陋的代码,只是尝试将“1tp \ r”写入串口然后再读取返回值(旋转阶段位置)。这是下面的代码。

    #include <stdio.h>
    #include <sys/types.h>
    #include <string.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    
    int main(int argc, char *argv[])
    {
      char line[1024];
      int chkin;
      int chkout;
      char input[1024];
      char msg[1024];
      char serport[24];
    
      // argv[1] - serial port
    
      sprintf(serport, "%s", argv[1]);
    
      int file= open(serport, O_RDWR | O_NOCTTY | O_NDELAY);
      printf("file descriptor: %d\n",file);
    
      if (file == 0)
        {
          sprintf(msg, "open_port: Unable to open %s.\n", serport);
          perror(msg);
        }
      else
        fcntl(file, F_SETFL, FNDELAY); //fcntl(file, F_SETFL, 0);
    
      while (1)
        {
    
          usleep (1000000);
          // printf("enter input data:\n");
          //scanf("%s",&input[0]);
          // printf("You entered %s\n",&input);
    
          //input= "1tp\r";
          chkin = write(file,"1tp\r",5);
          printf("chkin: %d\n",chkin);
    
          if (chkin<0)
        {
              printf("cannot write to port\n");
        }
          fcntl(file, F_SETFL, FNDELAY);
          //chkin=read(file,line,sizeof line);
          usleep (100000);
    
          //while ((chkin=read(file,line,sizeof line))>=0)
          //printf("chkin: %d\n",chkin);
          chkout = read(file, line ,sizeof line);
          //{
           if (chkout<0)
         {
           printf("cannot read from port\n");
         }
           else
         {
           printf("bytes: %d, line=%s\n",chkout, line);
         }
           //}
    
          /*CODE TO EXIT THE LOOP GOES HERE*/
          if (input[0] == 'q') break;
        }
    
      close(file);
      return 0;
    }
    

    嗯,它不起作用。当我将其运行为:./sertest /dev/ttyUSB0时,我只收到错误"cannot read from port"。实际上,问题似乎是"1tp\r"字符串似乎没有写入串口。此外,一旦完成此操作,串口设置似乎全部搞砸了,因为我无法通过简单的终端命令与舞台进行通信,需要使用minicom重置串口。

    我还应该注意,我知道我可以通过该代码的第二部分从串口读取一些东西,因为我已设法使用终端命令发送"1tp\r"字符串并只读取输出在下面的例子中使用相关的代码片段。

    所以,我会很感激如何成功地将这个简单的字符串"1tp\r"(或类似的字符串)写入串口,并替代读取串口。

    我不是程序员,所以我提前为这段代码的糟糕风格道歉。

0 个答案:

没有答案