2

シリアル デバイスを MacBook Air に接続するシリアル - USB コンバータ (FTDI、http://www.ftdichip.com/Drivers/VCP.htmからインストールされたドライバ) があります。MacBook では と の両方として表示され/dev/cu.usbserial-A4017CQYます/dev/tty.usbserial-A4017CQY私が説明するすべての動作は、これら 2 つのどちらを使用しても同じです。

編集:使用/dev/cu.*すると問題が解決しました。この質問を最初に投稿したときに、なぜうまくいかなかったのかわかりません。TTY の名前が逆になっていますが、私を正しい方向に導いてくれた duswuff に感謝し/dev/tty.*ます/dev/cu.*

私が最初に遭遇した問題は、フラグopen()を使用しないとsyscall が永久にブロックされるということでした。O_NONBLOCKフラグを使用すると、適切なファイル記述子を取得できますが、write()実際には書き込みが行われていないようで (ただし、バイトを書き込んだと主張して問題なく返されます)、read()「リソースが一時的に利用できません」というエラーで失敗します。

stty -af /dev/cu.usbserial-A4017CQY設定は問題なく表示されますが、 のようなコマンドで変更しようとするstty -f /dev/cu.usbserial-A4017CQY -clocalと、 を連続して呼び出して表示すると変更されたように見えますstty

読み取り/書き込みの前にデバイスの準備が整うのを待っていた場合select()、すぐに書き込みの準備ができていると報告されますが、読み取りはできません。write()これは、失敗しながら、文句なしに完了する方法とゲル化しread()ます。書き込まれたデータが実際にデバイスに到達することはないことに注意してください。

これをデバッグするために書いたテスト プログラム全体を以下に示します。

#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/select.h>

#define SYSCALL(A) do { ret = A; if (ret == -1) { perror(#A); return -1; } else printf("%s returned %d\n", #A, ret); } while (0)
int ret; /* necessary for SYSCALL */

int main()
{
    struct termios tio;
    char buf[256];
    int fd = open("/dev/cu.usbserial-A4017CQY", 
            O_RDWR | O_NOCTTY | O_NONBLOCK);
    fd_set rfds, wfds, xfds;
    struct timeval to;
    to.tv_sec = 5;
    to.tv_usec = 0;

    SYSCALL(tcgetattr(fd, &tio));

    cfmakeraw(&tio);

    tio.c_cflag = CS8|CREAD|CLOCAL;
    tio.c_cc[VMIN] = 1;
    tio.c_cc[VTIME] = 1;

    cfsetispeed(&tio, B115200);
    cfsetospeed(&tio, B115200);

    SYSCALL(tcsetattr(fd, TCSANOW, &tio));

    FD_ZERO(&rfds);
    FD_ZERO(&wfds);
    FD_ZERO(&xfds);
    FD_SET(fd, &rfds);
    FD_SET(fd, &wfds);
    FD_SET(fd, &xfds);

    int ret = select(fd+1, &rfds, NULL, &xfds, &to);
    if (ret == -1) perror("select");
    else if (ret > 0)
    {
        if(FD_ISSET(fd, &rfds))
            puts("Ready to read");
        if(FD_ISSET(fd, &wfds))
            puts("Ready to write");
        if(FD_ISSET(fd, &xfds))
            puts("Exception!");
    }
    else puts("Timed out!");

    SYSCALL(write(fd, "/home\n", 5));
    SYSCALL(read(fd, buf, 256));

    return 0;
}
4

1 に答える 1

1

フロー制御の問題があります。ケーブルの RTS/CTS と DTR/DSR/CD にループ バックして参加するか、もう一方の端に制御信号を提供させるか、@duskwuff が示唆するように、フロー制御を無視するデバイスを使用します。

設定しているようですが、うまくCLOCALいくはずですが、一部の USB デバイスは正しく動作しません。あなたの説明は、モデム制御信号を待っているデバイスと一致しています。

于 2014-11-13T01:53:38.987 に答える