Ich habe einen Raspberry PI Zero W über USB mit meiner virtuellen Maschine verbunden, die sowohl unter PC als auch unter RPI zu finden ist /dev/ttyS0
. Derzeit versuche ich, etwas vom RPI über das USB-Kabel an die virtuelle Maschine (PC) zu senden.
Ich versuche den Port mit folgendem Code zu lesen:
#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;
}
und auf der RPI-Seite habe ich ein kleines Bash-Skript erstellt, das das Zeichen 1 sendet:
while :
do
echo "sending character 1 to /dev/ttyS0"
echo "1" > /dev/ttyS0
done
Obwohl sowohl das Bash-Skript als auch das C-Programm in einer Endlosschleife laufen, empfange ich auf der PC-Seite jedoch nichts.
Was könnte der Grund sein?
NOTIZ: Der RPI ist über USB von der VM aus zugänglich, da ich SSH auf der VM verwende, um auf den RPI zuzugreifen. Also ja, die VM sollte bereits für den Zugriff auf den USB-Port konfiguriert sein.
BEARBEITEN: Ich habe versucht, den Code, in dem ich die Funktion read() implementiert habe, wie folgt zu ändern, sehe jedoch immer noch keine Änderungen:
#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;
}
Antwort1
In Ihrer Bearbeitung haben Sie der Funktion den Code zum Lesen vom Port hinzugefügt open_port()
. Es sieht zwar so aus, als ob es funktionieren könnte, aber das ist schlechter Stil: Jetzt open_port()
ist die Funktion spezifisch auf die Anforderungen dieses Programms zugeschnitten und kann nicht mehr einfach ohne Änderungen in einem zukünftigen Projekt ausgewählt und wiederverwendet werden. Und der Name der Funktion beschreibt nicht mehr genau, was die Funktion tut.
Ich bin nicht überzeugt, dass die Einrichtung Ihrer seriellen Verbindung korrekt ist: Sie sagen, Sie verwenden eine VM und dass USB beteiligt ist, aber Sie scheinen /dev/ttyS0
beide Enden zu verwenden. Das bezieht sich auf einen physischen seriellen Port, nicht auf einen USB-basierten.
Vielleicht haben Sie Ihre Virtualisierungssoftware so konfiguriert, dass sie einen tatsächlichen physischen seriellen Port oder einen seriellen Port, der vom USB-Seriell-Konvertertreiber des Hosts generiert wird, mit den VMs verbindet /dev/ttyS0
: Wenn das zutrifft, dann könnte das auf der PC-Seite funktionieren. Aber das istnicht die Standardeinstellung: das müssen Sie unbedingt in Ihrer Virtualisierungssoftware konfigurieren, sonst funktioniert es nicht.
Eine gängigere Konfiguration besteht darin, die Virtualisierungssoftware so zu konfigurieren, dass die VM auf die USB-Seite eines USB-Seriell-Konverters als Ganzes zugreifen kann. Dann würde es in der VM /dev/ttyUSB0
stattdessen etwa so angezeigt (abhängig vom genauen Typ des seriellen Konverters).
Auf der RasPi-Seite/dev/ttyS0
ist nicht vorhandenIn der Standardkonfiguration des Pi Zero W ist der typische serielle Port /dev/ttyAMA0
, aber in der Standardkonfiguration wird er von der Bluetooth-Funktionalität verwendet. Wenn Sie die USB-Seite des USB-Seriell-Konverters an den RasPi angeschlossen haben, würde er /dev/ttyUSB0
auch hier wie angezeigt.
Da Ihr RasPi-seitiges Skript die Existenz des Geräts nicht überprüft, hat es möglicherweise eine Datei mit dem Namen erstellt /dev/ttyS0
, die eine einzelne Zeile mit einer Nummer enthält 1
. Führen Sie diesen Befehl auf dem RasPi aus, um zu sehen, ob es sich /dev/ttyS0
um ein gültiges serielles Gerät handelt:
test -c /dev/ttyS0 && echo "Maybe valid" || echo "Definitely not correct"
/dev/ttyS0
Wenn Sie auf der RasPi-Seite eine physische serielle Verbindung ( oder ) verwenden /dev/ttyAMA0
, sollten Sie, soweit ich weiß, einen 40-poligen Stecker am RasPi Zero W einlöten und etwas an die Pins 8 und 10 dieses Steckers anschließen. Sie hätten auch verwenden müssen, raspi-config
um den Zugriff auf die serielle Schnittstelle zu ermöglichen.
Wenn Sie per SSH auf den RasPi zugreifen können, bedeutet das, dass Sie einenNetzwerkZusammenhang: Er sagt überhaupt nichts über den Zustand einesseriellVerbindung.