【发布时间】:2018-11-06 14:07:25
【问题描述】:
我正在编写一个网络驱动程序,它应该使用串行通信将数据包发送到 Arduino。这是一项家庭作业,仅用于教育目的。请在建议一切都可以在用户空间中完成之前考虑到这一点。
这个answer 陈述了filp_open 和filp_close,我认为我可以使用它们打开/dev/ttyACMx 或/dev/ttyUSBx,但我在其他地方读到使用I 不是一个好主意/O 内核内部的文件操作,所以我正在寻找更好的方法。
我还阅读了有关outb 和inb 的信息,但我还没有找到任何方法来获取这两个函数所需的port 数字参数。我曾尝试使用 lsusb 并写入其中一些 0xXX 端点地址,但它不起作用。
这是我的传输功能,我想写入串行端口而不是打印。我的辅助变量只是一个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 端口?
【问题讨论】:
-
文件 IO 和串行通信都不应该直接在内核模式下发生。
-
我明白为什么文件 I/O 不应该直接发生在内核中,但是你能详细说明为什么我应该避免在内核空间中进行串行通信吗?
-
在 Arduino 代码中:使用
Serial.write(Serial.read);以及无穷无尽的 println() 是为了什么? -
@Juraj 这不是我的问题。我只是展示了我想如何读取 Arduino 中的数据的示例。我的问题是如何在内核空间的串行上写。
-
忘记使用
outb和inb(或readb和writeb)。这仅与 UART 在端口 I/O(或内存映射 I/O)空间中实现的串行端口相关。此外,I/O 地址可能已经被串行 UART 驱动程序使用。从你的问题来看,听起来你想通过某种 USB 串行设备访问 Arduino 板,但连接到内核的网络层。
标签: c linux arduino linux-device-driver