(KURO-RS や PC-OP-RS1 をお使いのかたのところでは、
こんな現象発生していないのだろうか?
私のところだけ?)
試行錯誤の結果、
・「1文字受け取るまでブロックしない」ようにしておいて、
・コマンド送信後、3秒内にレスポンスがなければ再度コマンド送信
・他
とすれば、
USB ケーブルを接続した後の1回目でも
ちゃんとリモコンデータを送信してくれることがわかった。
てきとーに作ったパッチ。
yasunari@sil:/usr/local/src/kuro-rs$ diff -c rs_send.c.orig rs_send.c
*** rs_send.c.orig      2006-12-10 19:58:05.000000000 +0900
--- rs_send.c   2007-09-23 11:47:56.235174768 +0900
***************
*** 30,35 ****
--- 30,36 ----
    FILE              *data_fp        = NULL          ; /* リモコン情報ファイルポインタ    */
    struct termios     oldTIO                         ; /* 現在のシリアルポートの設定      */
    struct termios     newTIO                         ; /* 新規のシリアルポートの設定      */
+   int                retry_count;
    /* 引数チェック */
    if(argc >= 2)
***************
*** 66,72 ****
      goto final;
    }
-   tcgetattr(fd, &oldTIO);          /* 現在のシリアルポートの設定を退避させる */
    bzero(&newTIO, sizeof(newTIO));  /* 新しいポートの設定の構造体をクリア */
    newTIO.c_cflag= (BAUDRATE | CS8 | CLOCAL | CREAD);
--- 67,72 ----
***************
*** 76,94 ****
    newTIO.c_oflag=0;                /* rawモード */
    newTIO.c_lflag=0;                /* 非カノニカル入力 */
    newTIO.c_cc[VTIME]=0;            /* キャラクタ間タイマは未使用 */
!   newTIO.c_cc[VMIN]=1;             /* 1文字受け取るまでブロックする */
!   tcflush(fd,TCIFLUSH);            /* ポートのクリア */
    tcsetattr(fd, TCSANOW, &newTIO); /* ポートの設定を有効にする */
    /* リモコン情報送信 */
    sBuf[0] = 't';
    write(fd, &sBuf, 1);
!   read(fd, rBuf, BUFSIZE);
    if(rBuf[0] != 'Y')
    {
!     printf("send err  \n");
!     goto final;
    }
    /* 出力ポート番号選択 */
    if(strcmp(port_name, "2") == 0)
--- 76,107 ----
    newTIO.c_oflag=0;                /* rawモード */
    newTIO.c_lflag=0;                /* 非カノニカル入力 */
    newTIO.c_cc[VTIME]=0;            /* キャラクタ間タイマは未使用 */
!   newTIO.c_cc[VMIN]=0;             /* 1文字受け取るまでブロックしない */
!   tcflush(fd,TCIOFLUSH);           /* ポートのクリア */
    tcsetattr(fd, TCSANOW, &newTIO); /* ポートの設定を有効にする */
    /* リモコン情報送信 */
+ retry1s:
+   retry_count = 0;
    sBuf[0] = 't';
    write(fd, &sBuf, 1);
!
! retry1r:
!   if ( read(fd, rBuf, BUFSIZE) == 0 ) {
!     if ( ++retry_count > 3 )
!       goto retry1s;
!     sleep(1);
!     goto retry1r;
!   }
!
    if(rBuf[0] != 'Y')
    {
!     printf("send err  %x(%c)\n",rBuf[0],rBuf[0]);
!     sleep(1);
!     goto retry1s;
    }
+   tcflush(fd,TCIOFLUSH);            /* ポートのクリア */
+
    /* 出力ポート番号選択 */
    if(strcmp(port_name, "2") == 0)
***************
*** 108,120 ****
        sBuf[0] = '1';
    }
    write(fd, &sBuf, 1);
!   read(fd, rBuf, BUFSIZE);
    if(rBuf[0] != 'Y')
    {
!     printf("send err  \n");
!     goto final;
    }
    if((data_fp = fopen(data_filename, "rb")) == NULL)
    {
--- 121,145 ----
        sBuf[0] = '1';
    }
+ retry2s:
+   retry_count = 0;
    write(fd, &sBuf, 1);
! retry2r:
!   if ( read(fd, rBuf, BUFSIZE) == 0 ) {
!     if ( ++retry_count > 3 )
!       goto retry2s;
!     sleep(1);
!     goto retry2r;
!   }
!
    if(rBuf[0] != 'Y')
    {
!     printf("send err  %x(%c)\n",rBuf[0],rBuf[0]);
!     sleep(1);
!     goto retry2s;
    }
+   tcflush(fd,TCIOFLUSH);            /* ポートのクリア */
+
    if((data_fp = fopen(data_filename, "rb")) == NULL)
    {
***************
*** 122,140 ****
      goto final;
    }
    fread(sBuf, sizeof(unsigned char), REC_DATA_SIZE, data_fp);
    write(fd,&sBuf, REC_DATA_SIZE);
!   read(fd, rBuf, BUFSIZE);
    if(rBuf[0] != 'E')
    {
!     printf("send err \n");
!     goto final;
    }
    printf("Send File : [%s] \n",data_filename);
  /* 終了処理 */
  final:
-   tcsetattr(fd, TCSANOW, &oldTIO);
    if(fd != 0)
    {
      close(fd);
--- 147,173 ----
      goto final;
    }
    fread(sBuf, sizeof(unsigned char), REC_DATA_SIZE, data_fp);
+ retry3s:
+   retry_count = 0;
    write(fd,&sBuf, REC_DATA_SIZE);
! retry3r:
!   if ( read(fd, rBuf, BUFSIZE) == 0 ) {
!     if ( ++retry_count > 3 )
!       goto retry3s;
!     sleep(1);
!     goto retry3r;
!   }
    if(rBuf[0] != 'E')
    {
!     printf("send err  %x(%c)\n",rBuf[0],rBuf[0]);
!     sleep(1);
!     goto retry3s;
    }
    printf("Send File : [%s] \n",data_filename);
  /* 終了処理 */
  final:
    if(fd != 0)
    {
      close(fd);
yasunari@sil:/usr/local/src/kuro-rs$
    
yasunari@sil:/usr/local/src/kuro-rs$ mv /usr/local/bin/rs_send /usr/local/bin/rs_send.old yasunari@sil:/usr/local/src/kuro-rs$ cp send /usr/local/bin/rs_send yasunari@sil:/usr/local/src/kuro-rs$
yasunari@sil:/usr/local/src/kuro-rs$ /usr/local/bin/infrared_remocon BUTTON_POWER BUTTON_3 /usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER] /usr/local/lib/kuro-rs/DST-BX500/BUTTON_3 - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_3] yasunari@sil:/usr/local/src/kuro-rs$OK。
yasunari@sil:/usr/local/src/kuro-rs$ /usr/local/bin/infrared_remocon BUTTON_POWER /usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER] yasunari@sil:/usr/local/src/kuro-rs$OK。
yasunari@sil:/usr/local/src/kuro-rs$ /usr/local/bin/infrared_remocon BUTTON_POWER BUTTON_5 /usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER] /usr/local/lib/kuro-rs/DST-BX500/BUTTON_5 - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_5] yasunari@sil:/usr/local/src/kuro-rs$OK。
これで安心してハック de 録!! に取り込めるかな。
| 
 | 
 | 
| ← KURO-RS リモコンスクリプトの修正 | ハックの記録 LinkStation/玄箱 をハックしよう | → ハック de 録 !!の修正(1)BS デジタルの番組表取得 |