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
)에서 물리적 직렬 연결을 사용하는 경우, 내가 아는 한 RasPi Zero W에 40핀 커넥터를 납땜하고 해당 커넥터의 핀 8과 10에 연결해야 합니다. 또한 를 raspi-config
사용하여 직렬 포트 액세스를 활성화해야 합니다.
SSH를 통해 RasPi에 액세스할 수 있다면회로망연결: 연결 상태에 대해 전혀 알려주지 않습니다.TV 시리즈연결하다.