我的机器上有一个 C/Python 设置,我正在对串行通信进行一些测试,出于某种原因,我从不读取超过 1 个字节。
我的设置:我有一台 Windows 7 机器,在虚拟机中运行 OpenSUSE。我有 2 个 USB-RS232 转换器和它们之间的适配器(所以它是从一个 USB 端口到另一个的循环)。
在 Windows 端,我能够让它们通过 Python 到 Python 和 C 到 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) 睡觉
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);
}
似乎循环不起作用,所以未读取的数据会被丢弃吗? /编辑