gpt4 book ai didi

linux-kernel - 内核空间中的 RS232 串口通信

转载 作者:行者123 更新时间:2023-12-03 21:37:35 25 4
gpt4 key购买 nike

我正在为 编写内核模块Linux v3.2 控制外部激光器,但我无法通过机器上的 RS232 串行端口传输信号。

好像有一个序列号驱动程序已经在我的内核中编译,持有我想要访问的 ioport 地址的所有权:

# cat /proc/ioports | grep serial
02e8-02ef : serial
02f8-02ff : serial
03f8-03ff : serial

这是有道理的,因为 Linux 允许用户空间程序使用 /dev/ttyS*设备节点通过串行端口进行通信。例如,这是我为 LCD 面板设置设备的方法:

#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

...

/* Initialization and configuration */
const char *const lcd_dev = "/dev/ttyS1";
int lcd_dev_fd = open(lcd_dev, O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(lcd_dev_fd, F_SETFL, 0);

struct termios options;
tcgetattr(lcd_dev_fd, &options);

cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;

tcsetattr(lcd_dev_fd, TCSANOW, &options);

...

/* sending bytes */
const unsigned char scls[] = {0xFE, 'X', 0xFE, 75, 0xFE, 84, 0xFE, 'H'};
write(lcd_dev_fd, scls, sizeof(scls);

但是,这是一个用户空间接口(interface),因此与我的内核空间模块不兼容。我需要一种在内核空间内产生相同效果的方法(RS232 串行 I/O)。

虽然我可以卸载默认的 Linux 序列号驱动并将其替换为我自己的自定义 RS232 驱动,我不想在这里重新发明轮子——默认的 Linux 序列号驱动程序似乎支持我需要的功能。

有没有一种简单的方法可以通过内核空间中的 RS232 串行端口进行通信(可能通过这个默认的 Linux 串行 驱动程序),还是我只需要编写自己的自定义 RS232 驱动程序?

最佳答案

看看行学科 .您可以使用它将 tty 设备附加到内核空间中定义的一些读写例程,从而使用串行线编写驱动程序。线路规程从用户空间附加到它,内核将完成所有其余的工作。

一个很好的例子是 扫描 (drivers/net/can/slcan.c)。可以在 can-utils ( https://gitorious.org/linux-can/can-utils ) 中找到处理此问题的 libc 调用示例。如果您更喜欢按照 Linux 设备驱动程序的第 18 章工作,这将是一个很好的第一步:http://www.makelinux.net/ldd3/chp-18 ,虽然这本书不是很最新。一些细节也可以在 http://www.linusakesson.net/programming/tty/ 找到。 .

关于linux-kernel - 内核空间中的 RS232 串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19097377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com