2

問題: 私は、すべてのパッケージのグラフィック カラー バーコードをスキャンするハンドヘルド デバイスを持っています。デバイスを自動的にスライドさせる、使用できるトラック デバイスがあります。このトラック デバイスは、シリアル ポートを介して ascii コードを取得することによって機能します。これを Mac 上の FileMaker で動作させる必要があります。したがって、端末プログラムなどはありません...

これまでに得たもの: Keyspan USB/Serial アダプターを購入しました。ZTerm というプログラムを使用して、デバイスにコマンドを送信することに成功しました。例: "C,7^M^J"

また、次のコマンドを使用してターミナルで同じことを行うこともできました: screen /dev/tty.KeySerial1 57600 そして、上記の同じコマンドを入力します (ただし、入力したときに、キャリッジの Control-M と Control-J を押しただけです)。改行)

現在、FileMaker 用のプラグインを作成しています (もちろん C++ で)。上で行ったことを C++ で実現したいので、そのプラグインを FileMaker にインストールすると、これらの関数の 1 つを呼び出すだけで、プロセス全体をその場で実行できます。

デバイスに接続できますが、話しかけることができません。何にも反応しません。

これらを使用して(成功して)デバイスに接続しようとしました:

FILE *comport;
if ((comport = fopen("/dev/tty.KeySerial1", "w")) == NULL){...}

int fd;
fd = open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);

これは、デバイスと通信する方法でこれまでに試したことです。

fputs ("C,7^M^J",comport);

また

fprintf(comport,"C,7^M^J");

また

char buffer[] = { 'C' , ',' , '7' , '^' , 'M' , '^' , 'J' };
fwrite (buffer , 1 , sizeof(buffer) , comport );

また

fwrite('C,7^M^J', 1, 1, comport);

質問: ターミナルからデバイスに接続し、ZTerm を使用すると、ボー レートを 57600 に設定できました。しかし、私はここでそれを行う方法がわかりません....誰もそれを行う方法を知っていますか? 私はこれを試しましたが、うまくいきませんでした:

comport->BaudRate = 57600;

多くのクラス ソリューションがありますが、それらはすべて、termios.h や stdio.h などのインクルード ファイルを呼び出します。私はこれらを持っていません。何らかの理由で、ダウンロードするものを見つけることができません。いくつかの例をダウンロードしましたが、それらには 20 個ほどのファイルがあり、それらはすべて、見つけられない他のファイル (上記のファイルなど) を呼び出しています。これらを見つける必要はありますか?C++ について十分な知識がありません。ライブラリをダウンロードできる Web サイトはありますか?

別の解決策は、これらの端末コマンドを C++ に入れることです。それを行う方法はありますか?

だから、これは私を夢中にさせてきました。私は C++ の専門家ではありません。基本的なプログラミングの概念しか知りません。C++ の専門家はいますか? 理想的には、fwrite や fputs など、既に持っている関数を使用してこれを機能させたいと考えています。ありがとう!

4

5 に答える 5

5

^ を送信してから M を送信しても、control-M は送信されません。これはまさにその書き方です。制御文字を送信するには、ASCII 制御コードを使用するのが最も簡単な方法です。

ps。^M はキャリッジ リターン、つまり "\r" であり、^J は改行 "\n" です。

編集:おそらく、(できれば) 知る必要がある以上のことですが、先に進む前にThe Serial Port Howtoを読んでください。

于 2009-10-20T18:31:35.987 に答える
1

これは C++ に関する質問ではありません。TTYドライバーとやり取りしてボーレートを設定する方法を尋ねています。/dev の下にあるファイルを開いているという事実は、あなたが UNIX 派生物を使用していることを示しているため、Linux システムで読むべき関連する man ページは「man 3 termios」です。

基本的に、上記の open() バリアントを使用して、ファイル記述子を tcsetattr/tcgetattr に渡します。

于 2009-10-20T18:41:50.483 に答える
0

ioctlでボーレートを設定できます。例へのリンクを次に示します。

于 2009-10-20T18:47:57.350 に答える
0

使用している Unix を指定していないため、以下に、私が使用している Linux の製品コードをいくつか掲載します。

以下のコードはクラス メソッドであるため、外部 (宣言されていない) 参照は無視してください。

手順は次のとおりです-

termio 構造を構成します。これは、必要なフラグなどを設定する場所です (つまり、zterm を使用して実行した手順です。以下の termio 設定では、ポートを 8 データビット、1 ストップビット、パリティなし (8-n-1) に構成します。ポートも(cooked ではなく) "raw" モードになるので、文字ストリームになり、テキストは行にフレーム化されません。ボー定数は実際の値と一致します。つまり、56700 ボーの場合は "57600" を使用します。

タイミング パラメータは、文字が使用可能になるとすぐにデバイスから返されることを意味します。

端末パラメータを設定したら、(POSIX open() を使用して) デバイスを開き、fd を介して tcgetattr/tcsetattr を使用してデバイスを構成できます。

この時点で、read()/write() システム コールを使用してデバイスの読み取り/書き込みを行うことができます。

以下の例では、データが利用できない場合に read() がブロックされることに注意してください。ブロックが望ましくない場合は、select()/poll() を使用することをお勧めします。

それが役立つことを願っています。

termios termio    
tcflag_t baud_specifier;

    //reset device state...
    memset (&termio, 0, sizeof (termios));
    read_buffer.clear();

    //get our boad rate...
    if (!(baud_specifier = baud_constant (baud))) {
        ostringstream txt;
        txt << "invalid baud - " << baud;
        device_status_msg = txt.str();
        status = false;

        return (true);
    }


    //configure device state...
    termio.c_cflag = baud_specifier | CS8 | CLOCAL | CREAD;

    //do we want handshaking?
    if (rtscts) {
        termio.c_cflag |= CRTSCTS;
    }

    termio.c_iflag = IGNPAR;
    termio.c_oflag = 0;
    termio.c_lflag = 0;

    //com port timing, no wait between characters and read unblocks as soon as there is a character
    termio.c_cc[VTIME]    = 0;
    termio.c_cc[VMIN]     = 0;

    //open device...
    if ((fd = open (device.c_str(), O_RDWR | O_NOCTTY)) == -1) {

        ostringstream txt;
        txt << "open(\"" << device << "\") failed with " << errno << " - "
            << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    //keep a copy of curret device state...
    if (tcgetattr (fd, &old_termio) == -1) {

        ostringstream txt;
        txt << "tcgetattr() failed with " << errno << " - " << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    //flush any unwanted bytes
    if (tcflush (fd, TCIOFLUSH) == -1) {

        ostringstream txt;
        txt << "tcflush() failed with " << errno << " - " << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    //apply our device config...
    if (tcsetattr (fd, TCSANOW, &termio) == -1) {

        ostringstream txt;
        txt << "tcsetattr() failed with " << errno << " - " << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    node_log_f ("successfully initialised device %s at %i baud", "open_device()",
                device.c_str(), baud);

    status = true;
    return (true);
} 
于 2009-10-21T07:07:00.807 に答える
0

すべてのコンパイラ ツールを正しくインストールしましたか? 私の OS X 10.5.8 Mac では、思った通り、termios.h と stdio.h が /usr/include の下にあります。他の Unix バリアントでのシリアル ポート プログラミング用に既に見つけたコードは、Mac で動作するように (もしあれば) マイナーな変更のみを必要とするはずです。あなたが試したことと、何がうまくいかなかったかについて、もう少し教えていただけますか?

mgb には、制御文字をどのように表現する必要があるかについての良い点もあります。

于 2009-10-20T18:39:07.687 に答える