• ベストアンサー

シリアルポートからクロックを出したい

C言語を用いてシリアルポートから指定した周波数のクロックを出すことは可能でしょうか? 現在はEscapeCommFunction関数を用いて、010101・・・と出しています。 プログラムは、 EscapeCommFunction(立ち上がり) ・短いプログラム EscapeCommFuntion(立ち下がり) ・長いプログラム となっています。短いプログラムの部分が大変短いため、外部機器が立ち上がりに反応して、目標の動作を完了する前に、立ち下がりの命令が実行されてしまいます。 そのため、立ち上がってから、1を出力する時間を伸ばしたいのですが、なんとかならないでしょうか? どうかよろしくお願い致します。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Windowsのタイマーの分解能はせいぜいミリ秒単位です しかも正確さの面から言えばそれほどの精度はありませんよ WinAPIのSleepなどを使ってみてはいかがでしょう これならミリ秒単位での制御が出来ます 当方の確認では 10ミリ秒単位ぐらいなら制御可能なようです ヘッダーはWindows.hを使い Kernel32.Libをリンクします

tomo00223
質問者

お礼

なるほど。sleepというのがあるんですね。 初めて知りました。これならできそうです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

リアルタイム性のないマルチタクスOSであるWindowsで10数ms程度の誤差は普通にありえます。 なぜならタスクが切り替わると10数msは自タスク戻ってこない可能性があるためです。 もし、それが許容されないなら外付けのマイコンとかを使って制御することを検討してください。

tomo00223
質問者

お礼

回答ありがとうございます。 10数ms程度の誤差なら許容範囲ですが、もしうまくいかなかったら外付けマイコンの使用も検討してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シリアルポートについて

    シリアルポート(D-sub 9pin)をCで制御してリレーを使い簡単なロボットみたいなのを作りたいと思ってます。 シリアルポートの制御方法を自分なりに調べてみたのですが、Cでの制御方法がわからず皆様にご教授してもらおうと思いました。 まずシリアルポートを使うさいに必要な宣言などはありますか?(例えば変数など) それからシリアルポートにスイッチなどで信号を送りそれを元に判断する方法はありますか? そしてシリアルポートから外部に出力する方法はどうやればいいのでしょうか? 以上3つを教えてください。 なお自分自身CとBASICしかまだわかりませんのでC++よりCで教えていただけると光栄です。 皆様よろしくお願いします。

  • C言語のシリアルポート接続について

     連休中にPC98のMS-DOS機でシリアルポートで遊ぼうと 思いなんとかINP関数が在る事がわかりました。  しかし使い方がいまいち分りません。  INP関数にポート番号らしき物を入れてもなんの変化も出て来ま せん、、、。INP(1)とか、、、。  それではと、アドレスらしき物を入れようと思うのですが、シリアル ポートのアドレスがMS-DOSだとどこにあるのかわかりません。 適当に0x00~0x80ぐらいを回してディスプレイしたのですが、それっぽい 数値がありません、、、。  シリアルポートの接続先は携帯電話で、VBやBASICだと常に 電波状況を携帯に接続すると見えるのですが、C言語だと上手くいきません。  INPをループさせて、ポートぽいアドレスを何度か見ているのですが、 数値の変化がないし根本が間違ってる気がしてきました。  どなたか、C言語での簡単なシリアルポート接続を教えて下さい。  ポートのオープン方法とかがある気がしてたまらないんですが、、、。  古い言語で申しわけないのですが、宜しくおねがいします。

  • PDAのシリアルポートデータの消去

    PDA windows-CE上で動作する実務ソフトで、外部機器に送信するコマンド等のデータをRS-232Cを通じて出力するようになっているのですが、このデータがバッファ内に残っている場合に、データを外部のプログラムから消去できるでしょうか。 因みにポート番号は1番です。 もし、既存のプログラム、あるいはサンプルプログラム等ありましたら ご教授ください。 OSはウィンドウズCE 5.0dです。 間違って入力したデータを取り消したいのです。

  • シリアルポートの無いノートのハイパーターミナル接続

    古いXPのノートPCでシリアルポートが無く、USBシリアル変換アダプターを購入しました。外部機器に接続してデーターのやり取りをしたいのですが、出来ません。アドバイスがあったら教えて下さい。

  • Visual C++を用いたシリアル通信

    Visual C++ 2008で作成したWindow Form アプリケーションから,シリアルポートを介して,外部機器を操作しようとしています。 動作としてはフォーム上のテキストボックスに入力された文字を送る,というものです。 外部機器にデータを送る際,データの先頭に ENQ(ASCIIで0x05) を付加して送る必要があります。 0x05を送ったら,外部機器は30,78,30,35が送られてきたものと認識しているようです。 c++からASCIIで0x05を送りたい場合,どのようにプログラムを作成すればよろしいでしょうか? strings型の文字をASCII文字に変換する関数などはあるのでしょうか?

  • クロック数について

    P3の700MhzとP3の800MHZがあります。 クロック数は100違います。 *100違うと、どれくらい速いのですか? *800MHZで何が出来ますか?←謎 *プログラム(c言語)をやってみたいのですが、CPUはどれぐらい(周波数)必要ですか? お願いします。

  • 一つのシリアルポートを複数のソフトで共有するには

    ノートPCにシリアルポートを介して接続した外部機器の受信データを同時に立ち上げた複数のソフトで使いたいのですが、後から接続しようとするソフトからは接続できません。「仮想シリアルポートエミュレータ」で可能のようですが、お勧めのフリーソフトがあればご紹介お願いします。 具体例ですが ノートPCのシリアルポートにGPSアンテナを接続し、地図ソフト2本を同時に立ち上げてそれぞれ現在位置、移動速度情報などを表示させる。 WINDOWS7以降の32,64bitのPC対応で、常駐しないものがあれば助かります。

  • C言語のシリアル通信について

    C++でプログラムを書き、シリアル通信(RS232C)を使ってデバイスを動かしたいと試みているのですがよくわからないのでアドバイスお願いします。(OSはlinux) デバイス特有の命令を送るところがよくわかりません。(命令はキャラクタではなくバイナリで送らなければなりません。) 命令はバイナリデータです。 例、 char i[]={255,20,0,10}; ↑このようなデータです。 このようなデータを送る際はfwrite関数を使うということは調べたのですがどのように表すかわからないので教えていただきたいです。 初めのシリアルポートを開く際に”wb”をつけないといけないみたいですがどのようにつければいいのでしょうか。 fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NONBLOCK); if(fd<0) { printf("erroe\n"); exit(-1); } ↑自分が書いたポートを開く時のプログラムです。最初の行の最後に”wb"を付け足せば良いのですか。 上記の例のような命令を送るとすると fwrite(&i,sizeof(char),4,fd); return 0; で良いでしょうか。warningがでて動作しないのでアドバイスよろしくお願いします。 説明が下手で申し訳ありません。一番わからない点はシリアル通信で命令を送るときのポートオープンとfwriteを使った命令を送る形式です。どうぞよろしくお願いします。

  • WindowsAPIでシリアル通信プログラム(RS232C)

    Windowsで、VC++やVBを使わずに普通のC言語で簡単な文字列(コマンド)を外部機器に送信するプログラムを書きたいのですが、WindowsAPIというものの存在は知っているものの全くもって触れたことがありません。 取り合えず、パソコンから外部機器に文字列を送信することが出来ればよいのですが、すぐ実装に役立つような書籍などはありませんでしょうか? VCやVBでシリアル通信プログラムの解説をしている書籍は見つかるのですが、WindowsAPIで行っているものが見受けられません。 もし、ご存知でしたらよろしくお願い致します。

  • シリアルポートより電圧が出力?

    SOTEC社のノートPCを使用しています。 シリアルポート(D-Sub 9ピン)で シーケンサなどを通信させて使用しているのですが 相手側の機器によっては電圧変動でのトラブルが起こってしまいます。 とある方より「PCによってはDC5Vが出てしまう機種がある」 と言われました。 本当なのでしょうか? もし詳しくわかる方がいらっしゃれば その辺の説明を記載していただきたいのと同時に 5V出力を無効にする設定などがあれば 教えて下さい。