2


0

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

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

screen /dev/tty.KeySerial1 57600を使って同じことをターミナルでもやることができたし、そして同じコマンドをタイプインした(しかし私がタイプインしたときにキャリッジのためにControl-MとControl-Jを打ったリターンとラインフィード)

今、私はFileMaker用のプラグインを書いています(もちろん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);

or

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

or

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

or

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

質問:TerminalからZTermを使ってデバイスに接続したとき、ボーレートを57600に設定することができました。 私はそれがここで反応していない理由かもしれないと思う。 しかし、私はここでそれを行う方法がわからない…​. 誰もがそれを行う方法を知っていますか? 私はこれを試したが、うまくいかなかった:

comport-> BaudRate = 57600;

そこにはたくさんのクラスの解決策がありますが、それらはすべてtermios.hやstdio.hのようなインクルードファイルを呼びます。 私はこれらを持っていません、そして、何らかの理由で、私はそれらをダウンロードすることができません。 私はいくつかの例をダウンロードしましたが、それらの中には20個のファイルがあり、それらはすべて私が見つけることができない他のファイルを呼び出しています(上記のもののように)。 これらを見つける必要がありますか?その場合はどこにありますか? 私はCについて十分に知りません私は図書館をダウンロードできるウェブサイトがありますか?

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

だから、これは私を狂わせています。 私はCの男ではない、私は基本的なプログラミングの概念を知っているだけです。 誰かがCの専門家がいますか? fwriteやfputsなど、すでに持っている関数を使って作業したいのであれば理想的です。 ありがとうございます。

5 Answer


5


^を送信してからMを送信してもcontrol-Mは送信されません。つまり、制御文字を送信する最も簡単な方法は、http://en.wikipedia.org/wiki/Ascii#を使用することです。 ASCII_control_characters [ASCIIコントロール]コード。

ps。 ^ Mはキャリッジリターン、つまり "\ r"、^ Jはラインフィード "\ n"です。

編集:おそらくあなたが知っている必要があるでしょう(おそらく)あなたが思う以上に - しかし、先に進む前に The Serial Port Howtoを読んでください。


1


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

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


0


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

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


0


ボーレートは ioctlで設定できます。 例へのリンクです。


0


どのUnixを使用しているかは指定していないので、以下に私が使用しているLinuxプロダクションコードを投稿します。

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

手順は次のとおりです -

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

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

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

この時点でread()/ write()システムコールを使ってデバイスに読み書きすることができます。

以下の例では、利用可能なデータがなければread()がブロックするので、ブロッキングが望ましくない場合はselect()/ poll()を使用することをお勧めします。

お役に立てば幸いです。

termios termio tcflag_t baud_specifier;

//デバイスの状態をリセットします... memset(

//ボードレートを取得... if(!(baud_specifier = baud_constant(baud))){ostringstream txt; txt << "無効なボー - " <<ボー; device_status_msg = txt.str(); status = false。

戻り値(true)。 }

//デバイスの状態を設定します... termio.c_cflag = baud_specifier | CS8 | CLOCAL | CREAD;

//ハンドシェイクが必要ですか。 if(rtscts){termio.c_cflag | = CRTSCTS; }

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

// comポートのタイミング、文字間の待ち時間なし、文字termio.c_cc [VTIME] = 0があるとすぐにブロック解除を読み取ります。 termio.c_cc [VMIN] = 0。

//デバイスを開く... if((fd = open(device.c_str()、O_RDWR | O_NOCTTY))== -1){

ostringstream txt; txt << "open(\" "<< device <<" \ ")が" << errno << " - " << std_error_msg(errno)で失敗しました。 device_status_msg = txt.str(); status = false。

戻り値(true)。 }

//現在のデバイス状態のコピーを保存しています... if(tcgetattr(fd、

ostringstream txt; txt << "tcgetattr()が" << errno << " - " << std_error_msg(errno);で失敗しました。 device_status_msg = txt.str(); status = false。

戻り値(true)。 }

//(tcflush(fd、TCIOFLUSH)== -1)の場合、不要なバイトをフラッシュ

ostringstream txt; txt << "tcflush()が" << errno << " - " << std_error_msg(errno)で失敗しました。 device_status_msg = txt.str(); status = false。

戻り値(true)。 }

//デバイス設定を適用します... if(tcsetattr(fd、TCSANOW、

ostringstream txt; txt << "tcsetattr()が" << errno << " - " << std_error_msg(errno);で失敗しました。 device_status_msg = txt.str(); status = false。

戻り値(true)。 }

node_log_f( "デバイス%sを%iボーで正常に初期化しました"、 "open_device()"、device.c_str()、baud);

status = true;戻り値(true)。 }