• ベストアンサー

SIGIOについて

SIGIOの解説をみると「I/Oが使用可能になった」との記述がありますが これは例えばシリアルポートに当てはめると受信完了と送信可能の場合に発行 されるシグナルなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

>実はsigactionでSIGIO設定しfcntl(fd, F_SETOWN, getpid());で >シリアルポートのデータ受信を認識しようとおもっているのですが >もっと良い方法があるのでしょうか? 具体的なことがわからないので正確な判断はできませんが、 特に問題は無いと思いますが。 ただ、自分ではまだ使ったことがありませんので、 未確認です(^^;; ただ、プログラム上というか、手順というか、その辺を試したり、確認したりする必要はあると思います。 受信完了がどういう意味かによりますが、 たとえば送信側が1024バイトを送信した場合は、 SIGIOが発生しても、その時に読み込めるデータは おそらく1024バイトではありません。 場合によれば、1バイト受信しただけでSIGIOが発生するかも知れません。 それでいいかどうかです。 こういう場合に必ず1024バイト単位で処理をしたいなら、 別なプロセスなりスレッドなりでwait I/Oで 1024バイト読み込み、完了した時点で処理プロセスへ シグナルなりなんなりで通知するというような 処理にすると思います。 こういう感じのプログラムなら何度か作ってます。

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

受信完了という判断はできないと思うので、 受信データがあるという意味でしょう。 また、通常このシグナルは出ません。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html http://www.linux.or.jp/JM/html/LDP_man-pages/man7/signal.7.html

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html
shizuoka7
質問者

補足

実はsigactionでSIGIO設定しfcntl(fd, F_SETOWN, getpid());で シリアルポートのデータ受信を認識しようとおもっているのですが もっと良い方法があるのでしょうか?

関連するQ&A

  • I/Oポートorシリアルインタフェースがたくさんあるマイコン

    I/Oポートorシリアルインタフェースがたくさんあるマイコン 現在、I/Oポート若しくはシリアルインタフェースがたくさんあるマイコンを探しています。 10系統のコマンドを1個のマイコンで受け、その統計を取るような制御をしたいのですが、系統が多いため、なかなかデバイスが見つかりません。 コマンドは16ビット+ストローブ1ビットの計17ビットを予定しており、これが10系統なので170個のI/Oポートが必要になります。 コマンドそのものはシリアルで通信する事も可能ですが、10系統のシリアルを持つデバイスもなかなか無いので困っています。 170個以上のI/Oポートを持っているor10系統以上のシリアルインタフェースを制御できるマイコンを紹介頂けないでしょうか?

  • RS232 通信(2)

    PC_b のプログラムです よろしくお願い申し上げます Private Sub cmdPort1_Click() '変数宣言省略 ' 使用するシリアルポートを設定します。 Port1.PortNumber = 3 ' 通信条件を設定します。 Port1.BaudRate = 9600 Port1.DataBits = 8 Port1.StopBits = 1 Port1.Parity = parNone ' 受信バッファのサイズを設定します。 Port1.InputBufferSize = 4096 ' 送信バッファのサイズを設定します。 Port1.OutputBufferSize = 4096 ' フロー制御の種類を設定します。 Port1.Handshaking = hsRtsCts ' シリアルポートをオープンします。 blnOpenRet = Port1.Open(3, 9600, 8, 1, hsRtsCts, parNone, _ 10000, 10000, iomBlocking) On Error Resume Next ' 使用するシリアルポート、通信条件を設定し、 ' シリアルポートをオープンします。 ' 文字列にCR+LFを付けてデータを送信します。 lngOutputRet = Port1.Output("abcdefg1234" & Chr(&HD) & Chr(&HA)) ' 受信処理を行います。 lngInputRet = Port1.Input(strInputString, 5) ' 送信バッファにデータが残っている場合、 ' すべてが送信されるまで待機します。 Do DoEvents Loop Until Port1.OutputBufferByteCount = 0 ' 送信バッファと受信バッファをクリアします。 Port1.ClearOutputBuffer Port1.ClearInputBuffer 'オープンしているシリアルポートをクローズします。 If Port1.Opened Then ' シリアルポートをクローズします。 Port1.Close End If End Sub 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=453883

  • ブロッキングI/Oについて

    シリアルポートとGPIOポートを両方使用したプログラムを作成しました。read関数を使用した部分でブロッキングI/Oが原因となりGPIOポートが利用できなくなるという問題が起きました。 この問題自体はノンブロッキングI/Oの設定を行うことで解決できたのですが、以下の疑問が残りました。 ・なぜI/O処理をブロックする必要があるのか ・ブロッキングI/OとノンブロッキングI/Oはどのように使い分けるのか ・ブロッキングI/Oという機能は何故出来たのか I/Oポートの制限を行わない方がプログラムを作成しやすいと思うのですが、なぜread関数などは初期状態がブロッキングする状態になっているのでしょう。

  • シリアル通信でコマンドを送信し、戻ってきたら実行する

    VB初心者です。ぜひ、お分かりになる方がいらっしゃいましたら教えて下さい。 質問1:輝度計をシリアルポートに接続し、測定実行のコマンドを送信し、測定後にOKが戻ってきたら測定結果を受信するコマンドを送って結果を受信するというプログラムをVBで作成しています。MScommを使用し、測定実行コマンドを送信後、OKが戻ってくるところまでは出来たのですが引き続き、測定結果を受信するコマンドを送っても反応がありません。やけになって2行続けて書いたらなぜか、2行目が先に実行されてしまいました! 質問2:シリアルポートが開いたらForm2を開き、フォームの色をRGB関数で0に設定、測定コマンドを送信後に結果を受信したらフォームの色を1にするということを 繰り返し、255色まで行いたいのですがFor Nextで設定しても色が変わってくれず、なぜか255の白になってしまいます。色々、調べたのですがよく分からなくて。 とてもこまっています。宜しくお願いします。 Max = 255 For i = 0 To Max r = i: g = i: b = i FrmColor.BackColor = RGB(r, g, b) Next End Sub

  • 1分おきにファイルに保存したい

    Vine Linux 3.1のgccを使用しています。 早速ですが質問です。 シリアルポートへ不定期(数秒~数分間隔 バイナリデータ)に入ってくるデータを そのつど解析し分類別にカウント。 その結果を1分おきに ファイルへ保存したいと思っています。 シリアルポート周りやデータ処理周りは何とか 作れたのですが1分おきに・・・のところで つまずいています。 alarm(60);でシグナルを発生させ、 sigaction(SIGALRM・・・を使用し シグナルを補足、シグナルハンドラを処理後 select()(←シリアルポートのread()を待っている) のところで Interrupted system call が発生してしまいます。 CPU負荷をかけたくないので無限ループで時間を 毎回チェック・・・等は可能な限り避けたいと 思っています。 上記方法に限らず、何か良い方法とかありましたら 是非、ご教授ください。 どうぞよろしくお願いいたします。

  • シリアルの送信完了を待つ方法

    AdvantechのPCM-9575ボードにRedHat9を入れてCOM2 をRS-485にして115kでシリアル通信しています。 プログラム的には"/dev/ttyS1"を使用して普通の23 2Cポートと同じように操作できますが、送信イネー ブル信号(RTS 信号がつながっているのでioctl() 関数で制御できます)を操作してやらないと送受信 できないので、送信直前にセットし、送信完了直後 にクリアしたいと考えているのですが、write() 関 数が送信完了まで待ってくれないので、タイミング を作るのに困っています。 シリアルの送信完了待ちの方法とかご存じでないし ょうか?

  • VirtualBoxでのシリアル通信設定について

    VirtualBoxを使用したシリアル通信の設定方法について教えて下さい。 以下、やりたいこと及び、環境(設定)です。 【やりたいこと】 ホストOSとゲストOS間でシリアル通信を使用して、 データの送受信等をやりたいです。 【環境・設定】 ・VirtualBox ver.4.0.10 ・ホストOS WindowsXP SP2   通信ポート設定     COM1 有効     IRQ   04     I/O範囲 03F8~03FF   使用ソフト  ハイパーターミナル、SeriaDdebug ・ゲストOS Fedora8   通信ポート設定(VirtualBoxの設定→シリアル)     ポート1     シリアルを有効化にチェック     ポート番号 COM1(※COM2もやってみましたが、結果は変わりませんでした。)     IRQ     4     I/Oポート 0x3F8     ポートモード ホストデバイス     ポート/ファイルパス COM1     ※ポート2は設定していません。   使用ソフト minicom、自作アプリ ※上記条件でVirtualBoxのfedoraを立ち上げて、ホスト側でシリアル用ターミナルを 起動すると、ポートが開けません等のエラーログ(ポップアップ)が出ます。 設定方法、そもそものできる出来ない等のアドバイス、回答をお願い致します。 よろしくお願いします。

  • vb.net 2010からPICへのデータ送信

    vb.net2010のシリアルポートコントロールを使用してPICへデータを送り、受信した文字によって,制御を変えようとしています。 先日、こちらで質問させていただき,文字の送信はできるようになり、受信した文字によって制御を変えることができるようになりました。 しかし、文字列(例えば01やABなど)を送信した場合がうまくいきません。 文字列がきちんと受信できていないのかと思い、PCからデータ受信後、PICからPC文字列をそのままリターンすると問題なく受信できているようです。 このような場合、どういったことが原因と考えられるでしょうか? PIC側は受信割り込み内で、以下のようなコードです。      char buf[10]; buf[i]=getc(); if(buf[i] == '\r')//改行を受信するまで、配列に文字を格納 { buf[i]= '\0'; printf(buf);//PCに受信文字列をリターン if (i == 'ABC') { //受信文字列がABCの場合の処理 } else{           //受信文字列がABC以外の場合の処理 } }

  • シリアルポートを使用しているソフトウェアとは?

     FAXソフトをパソコンに入れて、セットアップし、送信をしようとしたところ、「シリアルポートを使用できません。 他のソフトウェアがシリアルポートを使用中である可能性があります。シリアルポートを使用しているソフトウェアを終了してください。」とエラーが出ました。  このソフトウェアとは何でしょう? またこれをいったんをはずすにには(faxを送信したいのですが)どうしたらいいのでしょうか?  ちなみにOSはビスタ、回線は光(フレッツ光プレミアム)です。faxモデムはCom7を直接制御となっています。FAXソフトは「まいとーくFAX8」です。

  • シリアルポートを使うDLLを複数のアプリから使いたい

    シリアルポートを使うDLLを複数のアプリから使いたい シリアルポートで通信するDLLを作りたいと思っています。通信先の機器も作成します。 このDLLを複数のアプリがロードして同時に使用することが可能でしょうか。 複数のアプリが同じDLLをロードして同一のシリアルポートを通じて接続先の機器と通信したいのです。 通信頻度は高くないので、通信のつどポートをオープンし、通信後クローズすれば可能だと思うのですが、正しいでしょうか、それともやっぱり出来ないのでしょうか。 欲を言えばポートをオープンしたままで通信したいのですが、無理でしょうか。 (オープン、クローズのオーバーヘッドはかなりのものだと思うので。) 通信といっても1~2バイト送信して1~2バイト受信するだけです。