【问题标题】:write to serial port while receiving tcp data接收 tcp 数据时写入串口
【发布时间】:2012-11-30 23:53:26
【问题描述】:

我正在编写一个程序,它应该接受来自 tcp/ip 端口和串行端口的信息。它也应该写入串行端口。我有两个程序(一个用于串行,一个用于 tcp/ip),但我试图将它们放入一个完整的程序中。我得到的结果是我只会在读取 tcp/ip 数据时读取串行数据。这不是什么问题。最大的问题是 write 函数似乎根本不起作用。有谁知道为什么?

这是执行串行功能的方法的代码。 main 方法创建 tcp/ip 套接字并调用此方法:

    int work()
    {

      //set up the serial port
       int result = 0;
       int portID = -1;
       char *device = "/dev/ttyUSB1";
       int rate = convertRate("115200");
       char parity = convertParity("N");
       int databits = convertDatabits("8");
       int stopbits = convertStopbits("1");
       portID = posixComOpen(device,rate,parity,databits,stopbits);


      maxslot = listener;
      do
      {

        fd_set set;
        int i;

        FD_ZERO(&set);

        FD_SET(1,        &set);
        FD_SET(listener, &set);
        for(i=0; i < SLOTCOUNT; i++)
        {
          if(slots[i])
          {
            FD_SET(slots[i], &set);
          }
        }

        int koliko = select(maxslot+1, &set, NULL, NULL, NULL);
        if(koliko==-1)
          err(5, "select()");

        if(FD_ISSET(1, &set))
        {

          int size;
          if(ioctl(1, FIONREAD, &size) != -1){
            char *buf;

        //    printf("Reading %d bytes...\n", size);
            buf = malloc(size+1);
            read(1, buf, size);
            buf[size] = 0;
        //    printf("Received %s\n", buf);

            broadcast_message(0, buf);

            free(buf);
          }
          else
            err(7, "ioctl() stdio");

        }
        if(FD_ISSET(listener, &set))
        {
          int accepted = accept(listener, NULL, NULL);
          if(accepted == -1)
            err(6, "accept()");

          slots[accepted] = accepted;
          if(accepted > maxslot)
            maxslot = accepted;
        }

        for(i = 0; i < SLOTCOUNT; i++)
        {
          if(slots[i] && FD_ISSET(slots[i], &set))
          {
        //    printf("Received on %d\n", i);


            int size;


            if(ioctl(i, FIONREAD, &size) != -1){

              if(size > 0)
              {
                char *buf;

        //        printf("Reading %d bytes...\n", size);
                buf = malloc(size+1);
                read(i, buf, size);
                buf[size] = 0;
        //        printf("Received %s\n", buf);

                broadcast_message(i, buf);

                free(buf);
              }
              else
              {
                shutdown(i, SHUT_RDWR);
                close(i);

                slots[i] = 0;

        //        printf("Disconnect on %d\n", i);
              }
            }
            else
              err(8, "ioctl() net");


          }
        }
        //recieve and send data to serial
char input =0;

        while(posixComDataReady(portID) && posixComRead(portID, &input)) {
        printf("%c", input);
        //fflush(stdout);
          } //while

         /* Write character to Vex */
         if(posixComWrite(portID, 'x') < 0)
           printf("Error Writing char %c",'x');
         //end serial code

      } while(1);
      return 0;
    }

编辑:这里是 poxixComWrite() 方法:

char posixComWrite(int port, char src) {
return (write(port, &src, 1) == 1);
} //posixComWrite 

同样,除了 PosixComWrite() 方法之外,该程序正在运行。它不会抛出错误。它返回“1”。我让它写入一个不接收字符的微控制器。当从 tcp/ip 的上下文中取出时,这是有效的。这里发生了一些奇怪的事情吗?

【问题讨论】:

  • posixComWrite() 不工作是什么意思?它什么都不发送?它失败并出现错误? posixComWrite() 里面有什么?
  • 这只是 write() 方法。我已经编辑了我的帖子。

标签: c sockets serial-port posix


【解决方案1】:

尝试暂停该进程,该进程在写入前会写入几毫秒。它将上下文切换并消除一些问题。

【讨论】:

  • 你的意思是使用usleep()几毫秒还是使用suspend()函数?
  • 不要走这条路,即使它有效,它也是一个 hack,而不是解决方案。
  • 我的意思是睡着了。任何操作系统中的进程都会经历三个状态中断->就绪->运行。当您执行 IO(或您的情况下的网络)时,您会将进程移至中断状态。根据您的系统设置方式,您可能无法再次进入运行状态以促进 TCP/IP 或串行的另一个中断。虚拟中断可能只允许进程通过另一个不涉及任何 I/O 操作的上下文切换。这绝不是最终的解决方案。但是,它将允许您将过程控制问题与 I/O 问题分开
  • 我在方法调用之前放置了一个usleep(500),它似乎根本没有影响结果。
  • 那么就不是中断问题了。它表明这两个调用单独工作但不在同一个程序中工作的唯一标志。尝试将它们移动到不同的线程中以再次欺骗上下文切换。您也可以尝试(如果您还没有)交易这两个电话的位置。它可能没有什么不同,但它会让你知道可能出了什么问题。这些问题需要很长时间才能破解。让我发帖,因为我对那里出了什么问题感兴趣。平台是什么?能看全节目吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多