2

私の割り当てでは、シリアルポートからの文字列を読み取る必要があります。これはカーネルモジュールで行う必要があるため、stdioライブラリを使用できません。私はこのようにしようとしています:

#include <linux/module.h>
#include <linux/unistd.h>
#include <asm/io.h>
#include <asm/fcntl.h>
#define SERIAL_PORT "/dev/ttyACM0"

void myfun(void){
  int fd = open(SERIAL_PORT,O_RDONLY | O_NOCTTY);
  ..reading...

}

しかし、それは私に「関数オープンの暗黙の宣言」を与えます

4

3 に答える 3

2

この関数を使用したい場合filp_open()は、カーネル空間でファイルを開くのが非常に役立ちます。あなたはここでその男を見つけることができます

からのファイルポインタfilp_open()はタイプstruct fileであり、完了したらfilp_close()で閉じることを忘れないでください。

#include <linux/fs.h>
//other includes...

//other code...    

struct file *filp = filp_open("/dev/ttyS0");
//do serial stuff...
filp_close(filp);
于 2012-10-31T11:56:18.707 に答える
1

カーネル ソースは非常に大きいため、それを回避する方法を見つけるのは非常に恐ろしいことです。私のお気に入りのコマンドは次のとおりfind . -iname "*.[chs]" -print0 | xargs -0 grep -i "<search term>です。

簡単な説明:

  • 見つける(明らか)
  • ドットはカーネルのルート ディレクトリです
  • iname は、大文字と小文字を区別せずに名前を検索します
  • .c .h および .s ファイルにはコードが含まれています - それらを調べてください
  • print0 は、見つかったときにヌルで終了して出力します
  • xargs は入力を受け取り、それを別のコマンドへの引数として使用します (-0 はヌル終了を使用します)
  • grep - 文字列を検索します (大文字と小文字を区別しません)。

したがって、この検索で​​は、「int open(」と入力すると、名前に tty が含まれるヒットがいくつか得られます (これらはコンソール用です)。コードを見て、必要なものかどうかを確認してください。

于 2012-10-31T11:47:52.410 に答える
-1

のヘッダー ファイルをインクルードしますopen。通常は#include <unistd.h>

編集:

カーネルの使用についてはわかりませんが、man 2 open.

私のバージョンの Linux では、次のすべてが必要になる場合があります。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

使用しているマクロによって異なります。

于 2012-10-31T11:27:38.503 に答える