2016-12-07 5 views
0

私はのは、そのピン5を想定してみましょうUbuntuの16.04 下のRS232 DB9オスコネクタで働いているが、私はecho "pippo" > /dev/ttyS0のようなコマンドを使用して、私はそれを見ることができるプロトコルアナライザを使用して、端末からの接続に書き込むことができる地面 です:書き込みがアプリケーション経由ではなく端末経由で行われると、rts信号が異なるのはなぜですか?

  • ピン3が正常信号
  • ピン4とピン7を送信している
  • ピン4とピン7、ピン3
  • ピン4とピン7上のデータ伝送ながら共にハイであるデータ送信前に、両方の低いですdの後に両方とも低い私は、次のCコード

    int file_descriptor = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); 
    unsigned char* buffer = (unsigned char*)"pippo"; 
    buffer_length = strlen((char*)buffer); 
    unsigned int written = 0; 
    while(written<buffer_length){ 
        unsigned int tmp = write (this_ptr->dev_file_descriptor, buffer+written, buffer_length-written); 
        if(tmp <0){ 
         break; 
        } 
        written += tmp; 
    } 
    tcdrain(this_ptr->dev_file_descriptor); 
    if(written != buffer_length){ 
        perror("Serial write failure\n"); 
        return-1; 
    } 
    close(file_descriptor); 
    

    を実行しようとした場合、ピンのATAトランスミッション3

は、今私は

  • データはピン3しかし
  • ピン4に伝達されていることがわかりますピン7は常にLOWです

私はRTSが必要ですこれらの2つのシナリオで動作が異なる理由を理解してください。

stty -F /dev/ttyS0 -a

の出力は、実際

速度9600ボーです。行0;列0;ライン= 0; intr =^C; quit =^\;消去= ^?;殺す=^U; eof =^D; eol =; eol2 =; swtch =; start =^Q;ストップ=^S; susp =^Z; rprnt =^R; werase =^W; lnext =^V;廃棄=^O; min = 1;時間= 0; -parenb -parodd -cmspar CS8 HUPCL -cstopb CREAD CLOCAL -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr ICRNL IXON -ixoff -iuclc -ixany -imaxbel -iutf8 OPOST -olcuc -ocrnl onlcrが-onocr -onlret -ofill -ofdel NL0 CR0 TAB0のBS0のVT0のFF0 ISIG ICANON IEXTENエコーECHOE ECHOK -echonl -noflsh -Xcase -tostop -echoprt echoctl echoke -flusho -extproc

と私が言ったようにそれが動作私のアプリケーションからではありません。

おかげで、私はすべてのエラー処理を含めるつもりはない

答えて

0

について、私はOPのための練習としてそれを残しておきます。

struct termios attr, oldterminfo; 
int fd, status; 

fd = open(devicename, O_RDWR); 

tcgetattr(fd, &oldterminfo); 
memcpy (&attr, &oldterminfo, sizeof(termios)) 
attr.c_cflag |= CRTSCTS | CLOCAL; 
attr.c_oflag = 0; 
tcsetattr(fd, TCSANOW, &attr); 

はここで高RTSフラグ

ioctl(fd, TIOCMGET, &status); 
status |= TIOCM_RTS; 
ioctl(fd, TIOCMSET, &status); 

を設定します。あなたが最初のCRTSCTSフラグを設定する必要があり、正しいファイルを含め、すべてのためのman ioctl/man tcgetattr/man tcsetattrなど

を行ってくださいあなたがデバイスにあなたの書き込みを行う場所です
.....

そして、完全な、実際には以下のケビンのアドバイスはCRTSCTSを設定するように動作していない低

ioctl(fd, TIOCMGET, &status); 
status &= ~TIOCM_RTS; 
ioctl(fd, TIOCMSET, &status); 
0

RTSフラグを設定するときは、(私はシリアルデバイスにいくつかのバイトを書き込もうとするたびにぶら下げアプリケーションを作ります私はCTS信号がスレーブによって設定されていないので、それを待っていると思います)。私はrs485シリアル出力を持つためにmoxa db9コンバータを接続するつもりですが、今は私のプロトコルアナライザで信号の論理ステータスをチェックしています。 しかし、ヒントは正しいです。つまり、RTSフラグをioctl関数で手動で設定すると、RTSが正しく管理されます。したがって、完全なハードウェアフロー制御なしでRTS信号を制御することだけに関心がある場合は、attr.c_cflag &= ~CRTSCTSでCRTSCTSフラグを無効にしてから、RTSピンに適切なioctl関数を使用して書き込み関数を作成する必要があります。代わりにハードウェアフロー制御をサポートするスレーブがあれば、CRTSCTSフラグを有効にするだけで十分です。

関連する問題