USB経由で私の仮想マシンにRaspberry PI Zero Wが接続されており、/dev/ttyS0
PCと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
数字を含む行を含むファイルを生成します。1
RasPiで次のコマンドを実行して、/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シリーズつながる。