【问题标题】:Read and write to Arduino serial using a kernel module使用内核模块读写 Arduino 串口
【发布时间】:2018-11-06 14:07:25
【问题描述】:

我正在编写一个网络驱动程序,它应该使用串行通信将数据包发送到 Arduino。这是一项家庭作业,仅用于教育目的。请在建议一切都可以在用户空间中完成之前考虑到这一点。

这个answer 陈述了filp_openfilp_close,我认为我可以使用它们打开/dev/ttyACMx/dev/ttyUSBx,但我在其他地方读到使用I 不是一个好主意/O 内核内部的文件操作,所以我正在寻找更好的方法。

我还阅读了有关outbinb 的信息,但我还没有找到任何方法来获取这两个函数所需的port 数字参数。我曾尝试使用 lsusb 并写入其中一些 0xXX 端点地址,但它不起作用。

这是我的传输功能,我想写入串行端口而不是打印。我的辅助变量只是一个union,它包含两个成员:struct sk_buff skbunsigned char bytes[sizeof(struct sk_buff)]。但在作业的这一点上,我只想将skb.data的内容发送到我的Arduino串口。

aux = skb;
while(aux != NULL) {
    p.skb = *aux;
    for(i = 0; i < p.skb.len; i++) {
        if(i == 0) {
            printk(KERN_INFO "\\%02x", p.skb.data[i]);
        }
        else {
            printk(KERN_CONT "\\%02x", p.skb.data[i]);
        }

    }
    aux = aux->next;
}

这是 Arduino 代码如下:

void setup() {
    Serial.begin(9600);
    Serial.println("Start");
}
void loop() {
    while(Serial.available() > 0)
        Serial.print(Serial.read());

    Serial.println();
}

就这么简单。我想在我的 Arduino 中读取一个数据包的内容。如何在我的网络驱动程序中写入/dev/ttyACMx/dev/ttyUSBx 端口?

【问题讨论】:

  • 文件 IO 和串行通信都不应该直接在内核模式下发生。
  • 我明白为什么文件 I/O 不应该直接发生在内核中,但是你能详细说明为什么我应该避免在内核空间中进行串行通信吗?
  • 在 Arduino 代码中:使用 Serial.write(Serial.read); 以及无穷无尽的 println() 是为了什么?
  • @Juraj 这不是我的问题。我只是展示了我想如何读取 Arduino 中的数据的示例。我的问题是如何在内核空间的串行上写。
  • 忘记使用outbinb(或readbwriteb)。这仅与 UART 在端口 I/O(或内存映射 I/O)空间中实现的串行端口相关。此外,I/O 地址可能已经被串行 UART 驱动程序使用。从你的问题来看,听起来你想通过某种 USB 串行设备访问 Arduino 板,但连接到内核的网络层。

标签: c linux arduino linux-device-driver


【解决方案1】:

不推荐文件 IO 的原因:文件 IO 正在阻塞文件。由于您在内核空间中打开文件,这将是一个坏主意。假设另一个进程想要打开同一个文件。

另一方面,如果你真的需要使用文件操作,filp_open / filp_close 是可以使用的。

如果您的作业没有指定使用什么,请使用内存地址写入。让您的写/读操作正常工作需要大量工作(与文件 IO 相比),但这是一种更好的方法。由于您正在写入地址本身,因此您不会阻止任何内容。

我的建议:花一些时间,研究您的数据表/内存映射并直接写入地址。您将必须编写一个用于设置寄存器方向(写入/读取)的函数以及一个读取寄存器或写入寄存器的函数。

【讨论】:

  • 我应该使用outbinb函数直接写入内存地址吗?如果是这样,我怎样才能得到我应该用来写的内存地址?例如,这个answer 引用了地址 0x3F8。如何获取我的 Arduino 的内存地址?
  • 这不是答案。他实际上需要一个将 UART 代理到网络层的驱动程序/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多