1

こんにちは、avr atmega32a と Linux ディストリビューションの間で通信しようとしています。USBポートでftdiチップを使用しています(VCOMドライバーなど)

avr と linux のコードを投稿しますが、minicom でテストしたところ avr のコードは正常に動作します。

ここでの問題は、Linux 上の私のコードにあると思います。基本的な問題は、機能する場合と機能しない場合があることです。ファイル記述子またはポート自体の開閉に関係があると思います。

なぜ私はこれを言っているのですか?

avr のコードは単純なことを行います。ボタンが押されるのを待ってから、「Hello world」の送信を永久に開始します。

したがって、minicom を使用すると問題なく動作します。

プログラムを初めて使用し、ボタンが押されるのを待つと、ボタンを押してもポートから何も読み取れないようです。

次に、minicom を開くと、すぐに読み取りが開始されます (ボタンが押されたため)。次に、minicom を閉じてプログラムを開くと、問題なく動作します....

ファイル(ポート)の開閉に問題があるようですが、よくわかりません。とにかく、これは十分に安定していません。

どんな助けでも感謝します。

私が書きたいのは、シリアルポートから連続して読み取ることです。読み取りのブロックについて読んだことがありますが、それを実装しようとするとうまくいかないようです。

ありがとう。

UPDATE* * else if (wordsRead < 0) printf("Error reading\n"); を追加しました。初めて読み取るときに-1になっているようですが、なぜこれが起こっているのかわかりません「Hello world」のプリント....

これが私のコードAVRのみの主な機能です。

int main()
{
    uart_init();
    //Set A0-6 as input, A7 as output
    //Set as hexademical cause compiler does not support 0b
    DDRA = 0x80;;
    //Triggers up
    PORTA = 0xFF;

    while ((PINA & 0x1) == 1);
    //Led on
    PORTA &= 0x7F; 

    while (1){  
        uart_putstring("Hello world ");
    }
}

これがLinux上の私のCコードです。

#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>

int main()
{
    //Open Port  
    int fdSP= open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NDELAY);
    if (fdSP == -1){
        printf("Error opening serial port\n");
        return 1;
    }

    // create the struct
    struct termios options;

    //Preferences
    int BaudRate = 19200;

    //Set Baud Rate
    cfsetispeed(&options, BaudRate);
    cfsetospeed(&options, BaudRate);

    //Set Parity (No Parity)
    options.c_cflag &= ~PARENB;

    //Set Stop Bits (2 Stop Bits)
    options.c_cflag &= CSTOPB;

    //Set Data Bits (8 Data Bits)
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;


    if (tcsetattr(fdSP, TCSANOW, &options) != 0){
        printf("Error applying settings to serial port\n");
        return 1;
    }



    //Read Port
    pid_t pid = fork();
    if (pid < 0){
        printf("Error creating child\n");
        return 1;
    }
    else if (pid == 0){
        raise(SIGSTOP);
        int wordsRead;
        char readSP;
        while (1){
            wordsRead = read(fdSP, &readSP, 1);
            if (wordsRead > 0)
                printf("%c", readSP);
                    else if (wordsRead < 0)
                            printf("Error reading\n");
           }
    }
    else{
        printf("Created a child to read from serial port\n");
        printf("To kill the child open another terminal and type sudo kill %ld or press enter ok?", (long) pid);
        getchar();
        kill(pid, SIGCONT);
        getchar();
        kill(pid, SIGKILL);

        if (close(fdSP) == -1){
            printf("Error closing port\n");
            return 1;
        };
    }
    return 0;
}
4

2 に答える 2

0

これ:

// create the struct
struct termios options;

初期化さ れていないを作成しますstruct termios。最初に現在のポート設定で初期化してから、設定を変更する必要があります。

// create the struct
struct termios options;
tcgetattr(fdSP, &options);
于 2014-01-28T16:45:54.807 に答える