我的操作系统是Ubuntu 16.04& MATLAB R2017a。
当我试图以非常见的波特率收听串口时,我收到错误:
s = serial('/dev/ttyUSB0','BaudRate',4000001)
f=open(s);
Open failed: BaudRate could not be set to the specified value.
我发现,有一个带有波特率定义的termios.h文件,比如那个
#define B3500000 0010016
#define B4000000 0010017
如果我设置未定义的波特率,我会收到错误。
所以,要以非常见的速度通过终端收听,我正在使用这段代码:
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <asm/termios.h>
int main(int argc, char* argv[]) {
if (argc != 3) {
printf("%s device speed\n\nSet speed for a serial device.\nFor instance:\n %s /dev/ttyUSB0 75000\n", argv[0], argv[0]);
return -1;
}
int fd = open(argv[1], O_RDONLY);
int speed = atoi(argv[2]);
struct termios2 tio;
ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = speed;
tio.c_ospeed = speed;
int r = ioctl(fd, TCSETS2, &tio);
close(fd);
if (r == 0) {
printf("Changed successfully.\n");
} else {
perror("ioctl");
}
}
之后,我能够以非常见的串行速度收听串口。
然后我回到Matlab,尝试设置在终端中工作正常的波特率。而且我仍然得到相同的错误,甚至更多,在创建串行对象后,所有设置都丢失了,并且它在终端中无法正常工作。
我认为Matlab正在使用一些基于termios.h的编译库,因此需要重新编译。 我错了吗?是否有可能解决这个问题?
还有另一种方法 - 为串口制作C程序然后使用MEX,用matlab连接它,看起来更不自然。