c - 以 31250 波特率从 USB 读取数据

标签 c usb arduino baud-rate

我有一 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/

相关文章:

c ->> 轮类运算符(operator)没有按预期工作

macos - 使用 Xcode 5 在 Mac OS X 上进行 Arduino 编程?

c++ - 数组 + union + 包含位字段 C++ 的结构

c - 使用 "while loop"而不是使用 "for loop"删除链表中的节点时出现错误

ios - Delphi XE6 在 iOS 中链接 C 代码

c++ - 使用带有 C 编译器的纯 C 和 C++ 编译器的 "C part"有什么区别?

linux - 控制 USB HID 设备可用控件的子集

c - 我在哪里可以找到有关在 C/linux 中为 USB 设备创建驱动程序的更多信息?

serial-port - 在 Windows 2000 上使用 USB 下载的 Arduino 编程失败

java - JAVA自动检测Arduino COM端口(最好通过JSSC)