[英]Read and write to Arduino serial using a kernel module
我正在編寫一個網絡驅動程序,該驅動程序應使用串行通信將數據包發送到Arduino。 這是一項家庭作業,僅用於教育目的。 請在建議一切可以在用戶空間中完成之前考慮到這一點。
這個答案說明了關於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
端口中寫入?
不建議使用文件IO的原因:文件IO目前正在阻止文件。 由於您是在內核空間中打開文件,因此這不是一個好主意。 想象另一個進程想要打開相同的文件。
另一方面,如果您確實需要使用文件操作,則可以使用filp_open / filp_close。
如果您的作業未指定要使用的內容,請使用內存地址進行寫入。 要使您的寫/讀操作生效,需要進行大量工作(與文件IO相比),但這是一種更好的方法。 由於您正在寫入地址本身,因此不會阻塞任何內容。
我的建議:花一些時間,研究數據表/內存映射,然后直接寫到地址。 您將必須編寫一個用於設置寄存器方向(寫/讀)的函數,以及一個用於讀取寄存器或寫入寄存器的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.