我正在编写一个网络驱动程序,该驱动程序应使用串行通信将数据包发送到Arduino。这是一项家庭作业,仅用于教育目的。请在建议一切可以在用户空间中完成之前将其考虑在内。
此answer讲述了filp_open
和filp_close
,我以为可以用它们打开/dev/ttyACMx
或/dev/ttyUSBx
,但我在其他地方读过在内核中使用I / O文件操作不是一个好主意,因此我正在寻找一种更好的方法。
我也了解了outb
和inb
,但是我还没有找到任何方法来获取两个函数所需的port
数字参数。我尝试使用lsusb并写入其中一些0xXX
终结点地址,但这没有用。
这是我想要的传输功能,而不是打印,而是要写入串行端口。我的aux变量只是一个包含两个成员的union
:struct sk_buff skb
和unsigned 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
端口中写入内容?
答案 0 :(得分:1)
不建议使用文件IO的原因:文件IO目前正在阻止文件。由于您是在内核空间中打开文件,因此这不是一个好主意。想象另一个进程想要打开相同的文件。
另一方面,如果您确实需要使用文件操作,则可以使用filp_open / filp_close。
如果您的作业未指定要使用的内容,请使用内存地址进行写入。要使您的写/读操作生效,需要进行大量工作(与文件IO相比),但这是一种更好的方法。由于您正在写入地址本身,因此不会阻塞任何内容。
我的建议:花一些时间,研究数据表/内存映射,然后直接写到地址。您将必须编写一个用于设置寄存器方向(写/读)的函数,以及一个用于读取寄存器或写入寄存器的函数。