在 Ubuntu 上使用 USB 到串行转换器进行串行通信

Posted

技术标签:

【中文标题】在 Ubuntu 上使用 USB 到串行转换器进行串行通信【英文标题】:Serial communications with a USB to Serial converter on Ubuntu 【发布时间】:2011-10-19 18:54:30 【问题描述】:

我有一个基于 FTDI 芯片的 USB 到串行转换,我将在某一时刻尝试通过 RS232 与电视通信。我正在运行 Ubuntu Maverick。

我是串行通信的新手,不明白为什么我不能简单地从端口读取字节。

串行环回测试成功。我将 Tx 和 Rx 短接在一起,然后运行以下 C 程序,我的键盘在屏幕上回显。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main(int argc,char** argv)

    struct termios tio;
    struct termios stdio;
    int tty_fd;
    fd_set rdset;

    unsigned char c='D';

    printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]);
    memset(&stdio,0,sizeof(stdio));
    stdio.c_iflag=0;
    stdio.c_oflag=0;
    stdio.c_cflag=0;
    stdio.c_lflag=0;
    stdio.c_cc[VMIN]=1;
    stdio.c_cc[VTIME]=0;
    tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
    tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       // make the reads non-blocking




    memset(&tio,0,sizeof(tio));
    tio.c_iflag=0;
    tio.c_oflag=0;
    tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
    tio.c_lflag=0;
    tio.c_cc[VMIN]=1;
    tio.c_cc[VTIME]=5;

    tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);
    cfsetospeed(&tio,B115200);            // 115200 baud
    cfsetispeed(&tio,B115200);            // 115200 baud

    tcsetattr(tty_fd,TCSANOW,&tio);
    while (c!='q')
    
            if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1);              // if new data is available on the serial port, print it out
            if (read(STDIN_FILENO,&c,1)>0)
            
              write(tty_fd,&c,1);                     // if new data is available on the console, send it to the serial port
            
    

    close(tty_fd);

然后,我将 USB 端插入 PC 上的 USB (/dev/ttyUSB0) 端口,并将电缆的 9 针端插入串行端口 (/dev/ttyS0)。

我在 /dev/ttyUSB0 上运行了之前的程序并在另一个终端窗口中输入:

echo "Hello world!" > /dev/ttyS0

什么都没有出现。我还尝试在 /dev/ttyUSB0 和 /dev/ttyS0 上的两个单独终端上运行该程序,但我无法从一个终端与另一个终端通信。

有谁知道我在这里做错了什么?

提前致谢!

【问题讨论】:

您是否尝试过使用 /dev/ttyS0 进行环回测试? 【参考方案1】:

我认为您需要同时配置 USB 串口和 db9 串口。 (即波特率、硬件、流量控制等) stty 或 setserial 是可以完成此操作的两个 linux 命令,请查看手册页或在线示例。

之后,您应该能够将字符串通过管道传输到设备中,并且它应该可以工作。

【讨论】:

以上是关于在 Ubuntu 上使用 USB 到串行转换器进行串行通信的主要内容,如果未能解决你的问题,请参考以下文章

FT232RL为接口转换芯片,可以实现USB到串行UART接口的转换

用于Mac OSX(10.14.6)Mojave的USB到串行驱动程序

使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?

Linux:在连接的 USB 串行加密狗上启动守护程序

如何始终如一地从串行端口记录数据?

将串行从 Raspberry 传递到 Arduino USB HID