• ベストアンサー

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

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

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

  • ベストアンサー
  • k-family
  • ベストアンサー率34% (180/523)
回答No.2

あまりの懐かしさに資料をひもときました。 シリアルポート(8251)はデータが30h、コントロールが32hですが、これでおわかりになりますか。その他にボーレートジェネレータとして8253を制御する必要もあります。割り込みを使う場合は8259と8255も制御する必要があります。必要ならこれらの情報もありますので言ってください。 ですが、BIOSコールを使った方がいいでしょう。INT19hで、 AH=00h 初期化 AH=03h で1バイト出力。データはAL などとやります。もしこの方法でトライされるならもう少し詳細なデータを書きます。 どちらの方法を使うにしてもハード(と言うほどのことはありませんが)の知識が多少必要です。文章で簡単に説明できるようなことではないですが、難しいことではないので是非トライしてみてください。 ここまでの情報は書籍かHPを検索されると出てくるかもしれません。昔はPC98専用のC言語があり、それには専用の関数が準備されていましたが、どの様なC言語をお使いでしょうか。

tell_me_plz
質問者

お礼

懐かしい事をして頂いてありがとうございます。 使っているC言語はLSIC-86の試食版です。Cを避けてたんですが、 コンピュータが大分わかってきたので、Cをやってみたのですが、 なかなか大変です。 BIOSコールの方はまだ良く分らないので、シリアルポート(8251) のデータが30h、コントロールが32hを使ってみたいと思います。 両方ともまだ分らないのですが、とりあえず調べたいと思います。 また別件で質問しそうなので、よろしくお願いします。 Cは独学なので、ヘンテコナ質問で皆さんすいません。もう少し マシな質問出来るまで頑張りますのでよろしくお願いします。

その他の回答 (1)

  • kabasan
  • ベストアンサー率44% (264/588)
回答No.1

C言語と言ってもライブラリなどは揃っているのでしょうか?BASICはシリアルボート用の関数が揃っていて、ドライバも持っていますが、汎用のCライブラリでは存在しません。従ってハードウェアをプログラムにより直接制御しなければなりませんが、シリアルコントローラの知識がなければ出来ません。 アドレスは基本的に2つ、データレジスタとコントロールレジスタです。アドレスはPC98のハードウェアで決まっていますので検索すれば出てきます。 私自身も昔プログラムしましたが、割り込みプログラムの知識がなければライブラリ無しでは作れません。 INP関数を知らなかったと言うことはDOS時代のいわゆる「べたべた」なプログラム(ハードウェアに依存しまくっているプログラム)を作られた経験がないようなので、ハードルは高いと思います。

tell_me_plz
質問者

お礼

 お忙しいところありがとうございます。  使っているC言語はLSIC-86の試食版でして、ようやくC言語が わかり始めたところです。ずっとBASICやCOBOL、VBの世界で 生きてきました。事務屋です。  データレジスタとコントロールレジスタの2つと割り込みプログラムの 事が必要なのは理解させていただきました。  ハードル高そうですね。DOS時代は汎用機にべったりだったので 基本的な事が完全に抜けてます。とほほ、、、。  まだ具体的な質問すら出来ませんのでこれからも宜しくお願いします。

関連するQ&A

  • シリアルとCOMポートとRS-232Cはどこが違うんですか?

    “シリアル”端子に“RS-232C”を接続し、デバイスマネージャーでCOMポートした。 これってどこがちがうんですか?

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

    現在、ASUSのP5Qというマザーボードを使用しているのですが、 JDMプログラマというPICライタをシリアルポートに接続したいので、 COM1ポートにシリアルポート(RS232C)のブランケットを 取り付けました。 デバイスマネージャではCOM1ポートを確認できるのですが、 いざ、JDMプログラマの書き込みソフトICProgを使って、 PICの書き込みを行うと失敗し、 ほかのシリアルポート接続の機器を接続しても動作しませんでした。 USBシリアル変換ケーブルはJDMプログラマでは、 電圧の関係で使用できませんので、 直接シリアルポートで接続できるにはどうしたらいいか 分からなくて困っています。 わかる方教えてください。 よろしくお願いします。

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

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

  • 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を使った命令を送る形式です。どうぞよろしくお願いします。

  • C言語で。。。。。

    C言語のプログラミングの勉強をしているのですが、 5.4のような小数点以下ありの数値の整数値を表示させる関数ってありますか??ネットを探してみてもよく分からなくて困っています(><)よろしくお願いします。

  • シリアルケーブルの接続

    シリアル接続のプリンターを新しいPC(DELL:Dimension4600C)に繋げたいのですが、シリアルポートがありません。 USB変換ケーブルは相性の問題があるのであまりよくないと聞きました。 パラレルポートはあるのでパラレル⇔シリアルの変換ケーブルというものもあるのでしょうか? それともシリアルのボードを増設したほうがいいのでしょうか? なるべくお金がかからないで確実に繋げられる方法はないでしょうか?

  • シリアルポートの増設

    USBゲームパッドが安定しないので、 シリアル接続のゲームパッドにしようと思ったのですが、 家のPCにはシリアルポートがついていませんでした。 そこで、増設しようと思うのですが、どうやって増設するのでしょうか。 PCIカードで増設できるようでしたら、XPに対応している おすすめの物を教えていただけませんか? 馬鹿な質問ですみません。

  • AVRのC言語について幾つか教えてください。

    AVRにCでプロプラムしてみようと思い、プログラムしてみています。 検索しても良くわからない事が幾つか有ったので質問させて下さい。 利用しているマイコンは2313です。 io.h内で各ペリフェラルのアドレスのような物を関連付けしている「_SFR_IO8()」っていうのと「_SFR_IO16()」っていう関数?の働きが良くわかりません。 printf()関数とか使えれば試せますが… #define  PORTD  _SFR_IO8(0x12) 等となっているので、 _SFR_IO8(0x11) = 0x7f; _SFR_IO8(0x12) = 0x7f; と書けばエラーを出さずにコンパイル出来ますし実行できます。 ですが関数ですとこういった使い方が出来ないように思うのですが… AVRに限らずC言語の機能の一部なのかも知れませんが今まで使った事が無い物なので無知でして、何方か知恵を貸していただけませんか?

  • シリアル・ポート ってなんでしょうか?

    昔は Rs232C とかいう、大きな 差込があったなあ。確かモデムを使っていたころだっのた、ような 気がします。 今頃になって、へんな事をおたずねいたしますが、いまわたし エプソンの Na14sと いうちいさなノートPCに、SSDを乗せて、使っています。 最近は、GPS付きの、サイクルコンピューターが、面白くって使っていますが、これがなんとUSB接続でありながらシリアルポートを使っているらしいんです。私のノートは、どうやらこのポートが無いらしく USBに接続しても、まったく認識しないのです。それでこの質問ですが、なんとなく、わかってきました。 さいきんは、とんと見なくなりましたが、ペンティアムぐらいの古いパソコンなら、探せばありましょうね。 いつごろきえたのでしょうか。 IDEのHDDも、古くはSASIを追いやったSCSIも、もう刺さるソケット すらないし、複雑なきぶんです。

  • C#でUSB使用時の仮想COMポートの番号をソフト上で参照する方法はありますか?

    USB-シリアルの変換ケーブルをパソコンにつないだとき、COMポートが設定されるが、そのポート番号をソフトで知る方法はありますか?そのような関数は存在しますか? 言語はC#です。