私のマシンには C/Python のセットアップがあり、シリアル通信でいくつかのテストを行っていますが、何らかの理由で 1 バイト以上を読み取っていません。
私のセットアップ: 仮想ボックスで OpenSUSE を実行している Windows 7 マシンがあります。私は 2 つの USB-RS232 コンバーターとそれらの間にアダプターを持っています (つまり、1 つの USB ポートから別の USB ポートへのループです)。
Windows 側では、Python-to-Python および C-to-Python を介して相互に通信できるようにすることができました。Linux VM を使用すると、C (Linux) から Python (Windows) にデータを取得できますが、逆の場合は 1 バイトしか返されません。ファイルを開いたり、Linux C コードで読み取りを実行したりする方法に問題があると考えていますが、何が問題なのかわかりません。
Python コード (PySerial を使用):
>>> import serial
>>> ser = serial.Serial(3)
>>> ser
Serial<id=0x2491780, open=True>(port='COM4', baudrate=9600, bytesize=8,
parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
>>> ser.read(5)
'Hello'
>>> ser.write("hi you")
6L
C コード:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int open_port()
{
int fd;
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0)
perror("open_port: Unable to open /dev/ttyUSB0 - ");
else
fcntl(fd, F_SETFL, 0);
return fd;
}
int swrite(int fd, char * str)
{
int n;
n = write(fd, str, strlen(str));
if (n<0)
printf("write() of %d bytes failed\n", strlen(str));
return n;
}
int main()
{
int fd, databytes;
char buf[100] = {0};
struct termios options;
fd = open_port();
//Set the baud rate to 9600 to match
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
tcsetattr(fd, TCSANOW, &options);
tcgetattr(fd, &options);
databytes = swrite(fd, "Hello");
if(databytes > 0)
printf("Wrote %d bytes\n", databytes);
databytes = read(fd, buf, 100);
if(databytes < 0)
printf("Error! No bytes read\n");
else
printf("We read %d bytes, message: %s\n", databytes, buf);
close(fd);
return 0;
}
そして、私は戻ってきています:
mike@linux-4puc:~> gcc serial_com.c
mike@linux-4puc:~> ./a.out
Wrote 5 bytes
We read 1 bytes, message: h
したがって、Linux-> Windows 書き込みは機能しており、python は正しい "Hello" 文字列を表示していますが、何らかの理由で、Windows->Linux 側で 1 バイトしか返されません。
誰かが何か間違っていると思いますか?
EDIT:
私が得たフィードバックに基づいて、コードに2つの微調整を試みました. すべてのデータがそこにあることを保証できないように聞こえるので、試してみました:
1) 睡眠
if(databytes > 0)
printf("Wrote %d bytes\n", databytes);
sleep(15); // Hack one to get the data there in time, worked
databytes = read(fd, buf, 100);
2) while ループ
while(1){ // Hack two to catch the data that wasn't read the first time. Failed
// this only saw 'h' like before then sat waiting on the read()
databytes = read(fd, buf, 100);
if(databytes < 0)
printf("Error! No bytes read\n");
else
printf("We read %d bytes, message: %s\n", databytes, buf);
}
ループがうまくいかないようで、読み取られなかったデータは破棄されますか?? /編集