我有一 block Arduino 开发板,想以自定义方式使用 USB 读取它传输的数据 baud速度。破解 Arduino 建议的一些代码,我得到了这个 C 代码:
int serialport_init(const char* serialport, int baud)
{
struct termios toptions;
int fd;
printf("init_serialport: opening port %s @ %d bps\n", serialport,baud);
fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
serialPortPointer = fd;
if (fd == -1)
{
printf("Unable to open port when initialising hardware'n");
return -1;
}
if (tcgetattr(fd, &toptions) < 0)
{
printf("Couldn't get term attributes when initialising hardware\n");
return -1;
}
speed_t brate = baud; // let you override switch below if needed
switch(baud) {
case 4800: brate=B4800; break;
case 9600: brate=B9600; break;
case 14400: brate=B14400; break;
case 19200: brate=B19200; break;
case 28800: brate=B28800; break;
case 38400: brate=B38400; break;
case 57600: brate=B57600; break;
case 115200: brate=B115200; break;
}
cfsetispeed(&toptions, EXTA);
cfsetospeed(&toptions, EXTA);
// 8N1
toptions.c_cflag &= ~PARENB;
toptions.c_cflag &= ~CSTOPB;
toptions.c_cflag &= ~CSIZE;
toptions.c_cflag |= CS8;
// no flow control
toptions.c_cflag &= ~CRTSCTS;
toptions.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl
toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw
toptions.c_oflag &= ~OPOST; // make raw
// see: http://unixwiz.net/techtips/termios-vmin-vtime.html
toptions.c_cc[VMIN] = 0;
toptions.c_cc[VTIME] = 20;
if(tcsetattr(fd, TCSANOW, &toptions) < 0)
{
printf("Couldn't set term attributes when initialising hardware\n");
return -1;
}
return fd;
}
问题是 termios.h
文件不支持 31250 (MIDI) 波特率...如果我尝试输入 31250 作为波特率,此函数返回 -1 并显示“初始化硬件时无法设置术语属性”(最后失败)。
那么 - 我如何用 C 或任何其他语言编写一个程序,以我想要的波特率读取数据? termios.h 是否支持自定义波特率?
我真的只是想读取串行端口上的数据 - 没有别的。
最佳答案
This 是一个在 Arduino 串行端口上启用 MIDI I/O 通信的库。您需要一个至少支持 2 个串行端口的 Arduino(例如 this one )。一个串行将用于与 MIDI 设备(31250bps)通信,另一个用于与 PC 通信(例如 115200bps)。如果您的 Arduino 板上只有一个串行端口,那么您还可以尝试使用软件串行库,例如 this .
关于c - 以 31250 波特率从 USB 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478582/