使用内核模块读取和写入Arduino串行

时间:2018-11-06 14:07:25

标签: c linux arduino linux-device-driver

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

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

我也了解了outbinb,但是我还没有找到任何方法来获取两个函数所需的port数字参数。我尝试使用lsusb并写入其中一些0xXX终结点地址,但这没有用。

这是我想要的传输功能,而不是打印,而是要写入串行端口。我的aux变量只是一个包含两个成员的unionstruct 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端口中写入内容?

1 个答案:

答案 0 :(得分:1)

不建议使用文件IO的原因:文件IO目前正在阻止文件。由于您是在内核空间中打开文件,因此这不是一个好主意。想象另一个进程想要打开相同的文件。

另一方面,如果您确实需要使用文件操作,则可以使用filp_open / filp_close。

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

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