ttyS0からの読み書き

ttyS0からの読み書き

USB経由で私の仮想マシンにRaspberry PI Zero Wが接続されており、/dev/ttyS0PCとRPIにあります。現在、USBケーブルを介してRPIの一部のコンテンツを仮想マシン(PC)に送信しようとしています。

次のコードを使用してポートを読み取ろうとします。

    #include <stdio.h>   /* Standard input/output definitions */    
    #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 */    

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

   int fd; /* File descriptor for the port */

   int open_port(void)    
   {            
     fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);   

     if(fd == -1) 
     {       
       /*        * Could not open the port.        */        
       perror("open_port: Unable to open /dev/ttyS0 − ");      
     }      
     else        
      fcntl(fd, F_SETFL, FNDELAY);      

    return (fd);    
  }

  int close_port(void)
  {
    close(fd);
    return (fd);
  }


  int main()
  {
    printf("Serial reader has started...\n\n");
    while(1)
    {
      open_port();
      close_port();
    }

    return 0;
  }

RPI側では、文字1を送信する小さなbashスクリプトを作成しました。

while :
do
    echo "sending character 1 to /dev/ttyS0"
    echo "1" > /dev/ttyS0
done

しかし、bashスクリプトとcプログラムの両方が連続ループで実行されていますが、PC側では何の情報も受け取りません。

なぜですか?

メモ: RPIにアクセスするために仮想マシンでSSHを使用しているため、USB経由で仮想マシンからRPIにアクセスできます。はい。 VMはUSBポートにアクセスするようにすでに設定されている必要があります。

編集する: コードをこれに変更してみました。ここで read() 関数を実装しましたが、まだ変更は表示されません。

    #include <stdio.h>   /* Standard input/output definitions */    
    #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 */    

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

   int fd; /* File descriptor for the port */
   unsigned char bufptr;
   int reader;

   int open_port(void)    
   {            
     fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);   

     if(fd == -1) 
     {       
       /*        * Could not open the port.        */        
       perror("open_port: Unable to open /dev/ttyS0 − ");      
     }      
     else
     {        
      fcntl(fd, F_SETFL, FNDELAY);
      reader = read(fd, &bufptr, 1);
        if (reader > 0)
        {
          write(STDOUT_FILENO, &bufptr, 1);  
        }
     }

    return (fd);    
  }

  int close_port(void)
  {
    close(fd);
    return (fd);
  }


  int main()
  {
    printf("Serial reader has started...\n\n");
    while(1)
    {
      open_port();
      close_port();
    }

    return 0;
  }

ベストアンサー1

編集時open_port()にポートから読み取る関数のコードを追加しました。うまくいくようですが、スタイルは良くありません。このopen_port()機能はプログラムの要件によって異なり、将来のプロジェクトで変更しなくても、これ以上選択して再利用することは容易ではありません。そして、関数名は、もはや関数が何をするのか正確には説明しません。

シリアル接続が正しく設定されていないと思います。私は仮想マシンを使用していてUSBが関連していると言っていましたが、/dev/ttyS0両端で使用しているようです。これは、USBベースのシリアルポートではなく物理シリアルポートを表します。

おそらく、物理物理シリアルポートまたはホストのUSBシリアルコンバータドライバによって生成されたシリアルポートをVMに接続するように仮想化ソフトウェアを設定した可能性があります/dev/ttyS0。これが真であれば、PC側で動作できます。しかしそれはデフォルトではありません:仮想化ソフトウェアで構成する必要があります。それ以外の場合は動作しません。

より一般的な構成は、仮想マシンがUSBシリアルコンバータのUSB側への全体的なアクセスを可能にするように仮想化ソフトウェアを構成することである。その後、仮想マシンに次のように表示されます/dev/ttyUSB0(正しいタイプによって異なります)。シリアルコンバータ)。

RasPi側では/dev/ttyS0 存在しないPi Zero Wのデフォルト設定では、一般的なシリアルポートはありますが、/dev/ttyAMA0デフォルト設定ではBluetooth機能に使用されます。 USBシリアルコンバータのUSB端をRasPiに接続した場合は、ここにも表示されます/dev/ttyUSB0

RasPi側のスクリプトはデバイスが存在するかどうかを確認しないため、おそらく/dev/ttyS0数字を含む行を含むファイルを生成します。1RasPiで次のコマンドを実行して、/dev/ttyS0有効なシリアルデバイスであることを確認します。

 test -c /dev/ttyS0 && echo "Maybe valid" || echo "Definitely not correct"

RasPi側(/dev/ttyS0または/dev/ttyAMA0)で物理シリアル接続を使用している場合は、私が知っている限り、40ピンコネクタをRasPi Zero Wにはんだ付けし、そのコネクタのピン8と10に接続する必要があります。また、をraspi-config使用してシリアルポートアクセスを有効にする必要があります。

SSH経由でRasPiにアクセスできる場合ネットワーク接続:接続状態についてはまったく通知しません。TVシリーズつながる。

おすすめ記事