1

tcp/ip ポートとシリアル ポートの両方から情報を受け取るプログラムを作成しています。また、シリアルポートへの書き込みも想定されています。2 つのプログラム (シリアル用と tcp/ip 用) がありますが、それらを 1 つのプログラム全体に配置しようとしています。私が得ている結果は、tcp/ip データが読み取られるときにシリアル データのみを読み取るということです。これは、そんな問題ではありません。大きな問題は、書き込み機能がまったく機能していないように見えることです。誰かが理由を知っていますか?

シリアル関数を実行するメソッドのコードを次に示します。メイン メソッドは 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;
    }

EDiT: poxixComWrite() メソッドは次のとおりです。

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

繰り返しますが、このプログラムは PosixComWrite() メソッドを除いて機能しています。エラーにはなりません。「1」を返します。文字を受信しないマイクロコントローラーに書き込んでいます。これは、tcp/ip のコンテキストから取り出されたときに機能していました。ここで奇妙な出来事が起こっていますか?

4

1 に答える 1

-2

書き込みの直前に数ミリ秒間書き込みを行うプロセスを一時停止してみてください。これにより、コンテキストが切り替わり、いくつかの問題が解消されます。

于 2012-11-30T23:57:27.787 に答える