簡體   English   中英

使用內核模塊讀取和寫入Arduino串行

[英]Read and write to Arduino serial using a kernel module

我正在編寫一個網絡驅動程序,該驅動程序應使用串行通信將數據包發送到Arduino。 這是一項家庭作業,僅用於教育目的。 請在建議一切可以在用戶空間中完成之前考慮到這一點。

這個答案說明了關於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端口中寫入?

不建議使用文件IO的原因:文件IO目前正在阻止文件。 由於您是在內核空間中打開文件,因此這不是一個好主意。 想象另一個進程想要打開相同的文件。

另一方面,如果您確實需要使用文件操作,則可以使用filp_open / filp_close。

如果您的作業未指定要使用的內容,請使用內存地址進行寫入。 要使您的寫/讀操作生效,需要進行大量工作(與文件IO相比),但這是一種更好的方法。 由於您正在寫入地址本身,因此不會阻塞任何內容。

我的建議:花一些時間,研究數據表/內存映射,然后直接寫到地址。 您將必須編寫一個用於設置寄存器方向(寫/讀)的函數,以及一個用於讀取寄存器或寫入寄存器的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM