シリアル通信をするには?

解決


初めてのVC  2008-03-18 00:10:48  No: 67864

初心者ですので基本的なことを聞いてしまいますが、教えて頂けると助かります。

Visual C++ 2005にてプログラムを製作しようと思っています。
ボタンを押したらRS232通信で文字を送るようなプログラムを作りたいのですが、参考書等を探してみても見つけられません。
ハイパーターミナルを用いてRS232通信をしたことはありますので、設定のやり方を教えて頂ければできるかと思っていますが…。
良い参考書やインターネット上に参考になるものがあればそれも教えて頂けると助かります。

これからプログラムの勉強をしていこうと思っていますので、的を得ていないような発言もあるかも知れませんがそういったことも教えて頂ければと思います。
よろしくお願いします。


そだ  2008-03-18 00:40:59  No: 67865

参考書がなくてもググれば結構出てきますよん。まずは検索

CreateFileを使った例
http://www.takebay.net/~daigo-ao/paddlewiki.pl/title_A5B7A5EAA5A2A5EBC4CCBFAE2852532D3233324329A4C7C1F7BFAEA1A6BCF5BFAEA4F2B9D4A4A6A5D7A5EDA5B0A5E9A5E0.html
http://0n0.fc2web.com/bcc/ser/com01.html

.NET Frameworkの機能を使った例
http://www.robotsfx.com/robot/robohow/RoboHow60/RoboHow60.html

MSCommを使った例
http://www.picfun.com/serial00.html


初めてのVC  2008-03-18 23:56:03  No: 67866

そださんありがとうございます。

しかし、自分は今、MFCアプリケーションのシングルドキュメントでCFormViewにてボタンを配置し、そのボタンを押したら文字を送信するプログラムを考えています。
受けて側はテスト済で、文字を送ればちゃんと動作します。

C言語自体は少しやってきましたが、VCは初めてで全然わかりません。。。
よろしくお願いします!!


そだ  2008-03-19 02:13:35  No: 67867

>しかし、自分は今、MFCアプリケーションのシングルドキュメントでCFormViewにてボタンを配置し、そのボタンを押したら文字を送信するプログラムを考えています。
>受けて側はテスト済で、文字を送ればちゃんと動作します。

>C言語自体は少しやってきましたが、VCは初めてで全然わかりません。。。

MFCはC++です。
クラスをある程度理解していないと厳しいので注意してください。

今からWindowsプログラミング始め、
特にこだわる理由がないのであればMFCではなく
将来性のある  .NET Framework をお勧めします。
何か制約があってMFCを使わなければならないのであれば、
CreateFileを使った例(一番上のURL)がMFCを使っているので
そちらを参考にしてください。

シリアル通信の前に、
まずはC++と、MFCまたは.NETの基礎を
参考書やWebサイトで固めることをお勧めします。


初めてのVC  2008-03-19 23:27:27  No: 67868

そださんアドバイスありがとうございます。

仕事の都合上ですので。。。
一応、各コントロールの使い方なんかは覚えたつもりで、ステップアップしたいんですが、どの参考書を見てもコントロールの使い方を教えているものしか見つからなくて。。。
よろしければ、実際にプログラムを作るのに役立つ参考書なんかをご紹介いただけますか?


そだ  2008-03-20 08:44:04  No: 67869

>一応、各コントロールの使い方なんかは覚えたつもりで、ステップアップしたいんですが、どの参考書を見てもコントロールの使い方を教えているものしか見つからなくて。。。
>よろしければ、実際にプログラムを作るのに役立つ参考書なんかをご紹介いただけますか?

MFCだけでなんとかしようとすると厳しいかもしれませんが、
URLを掲示したようにWin32API(←MFCアプリでも利用できる)を
使ってシリアル通信を実装している例があるのでそういった
参考書を探すことをお勧めします。

私自身は元々この手のプログラムをしておらず、
シリアル通信に関する参考書も持っていないのでお勧めできません。
知っている方がいましたら勧めてあげてください。
(もっともざっと検索してもあるので探せば見つかると思います)
http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4GGIC_jaJP233JP236&q=%e3%82%b7%e3%83%aa%e3%82%a2%e3%83%ab%e9%80%9a%e4%bf%a1%e3%80%80VisualC%2b%2b+%e6%9c%ac

できればプログラム専門の大きなコーナーを設けている
本屋さんで読みながら探すことをお勧めします。


PATIO  2008-03-21 20:16:56  No: 67870

一言だけ。

C++言語のクラスの部分の理解が無いとMFCでプログラミングは難しいです。
仕事である程度の品質を求められる場合はなおさら厳しいです。
特にMFCに関しては派生クラスをバリバリ使うタイプなので
派生クラスと仮想関数の概念が理解できていないとソースを読むのが
難しいケースが出てきます。
そのくらいなら理解できていると言う話であれば良いのですが、
分からないならC++言語の本を一読くらいはした方が良いと思いますよ。
C言語をきちんとマスターしているのであれば、基本的な文法の方は
ほとんど同じなので、違いの部分を押さえておけば良いでしょう。
問題はクラスの概念と、派生、仮想関数の部分でしょうねぇ。
C言語には無い概念になるので。


www  2008-03-22 01:14:08  No: 67871

凄い長い一言だねぇw


そだ  2008-03-22 02:31:39  No: 67872

確かにMFCやるのにC言語の知識だけじゃ困惑しますからね。
C++の参考書を買うかその手のWebサイトを見つけることも
考えられた方がいいと思います。


初めてのVC  2008-04-03 19:00:34  No: 67873

皆様にアドバイスを頂いていたのに報告が遅くなって申し訳ありません。

おかげさまでシリアル通信ができるようになりました!
完璧には理解できていないと思いますが。。。

ちなみにタイムアウトの設定で
timeouts.ReadTotalTimeoutConstantの受信の定数時間ってどういうことですか?1文字を受信するのに待つ時間と解釈しているのですが。


そだ  2008-04-03 20:32:00  No: 67874

1文字ではなく通信量に依存しないタイムアウト値のようですね。
http://donnk.com/Nmura/soft/help015.html


初めてのVC  2008-04-04 00:04:14  No: 67875

解決したと言った後ですいません。

例えばReadFile(Handle, data, 3, num, NULL);
とすると、3文字読み込んだらReadFileを抜けますが、
ReadTotalTimeoutMultiplierで設定した時間は1文字目を読んだ後に次の文字を読むまでの待ち時間で
ReadTotalTimeoutConstantで設定した時間はReadFileに入ってから1文字目を読み込むまでの待ち時間
というとらえ方でいいんですか?

そうすれば1文字目の待ち時間で最大ReadTotalTimeoutConstant待って、その後1文字ごとに最大ReadTotalTimeoutMultiplier待つって考えれば

受信タイムアウト=ReadTotalTimeoutMultiplier*受信バイト数+ReadTotalTimeoutConstant

ってのもなんとなくわかるんですが・・・


そだ  2008-04-04 02:26:21  No: 67876

>ReadTotalTimeoutMultiplierで設定した時間は1文字目を読んだ後に次の文字を読むまでの待ち時間で
>ReadTotalTimeoutConstantで設定した時間はReadFileに入ってから1文字目を読み込むまでの待ち時間

ここ
http://msdn2.microsoft.com/en-us/library/aa363190(VS.85).aspx
をどう解釈するかですが、

上記URLのReadTotalTimeoutMultiplierの解説に

calculate the total time-out period for read operations

とあるので、1バイト読み込むごとにReadTotalTimeoutMultiplier秒を
経過してないか監視するのではなく、あくまでReadFile全体の
タイムアウト時間を計算するのにつかわれるだけだと思います。


yoh2  2008-04-04 08:06:19  No: 67877

初めてのVCさんの書きこみ

> 1文字目を読んだ後に次の文字を読むまでの待ち時間で

に相当するのはReadIntervalTimeoutです。
とすると、ReadTotalTimeoutMultiplierについても同じ意味を持っているとは
考えにくいので、ReadTotalTimeoutConstantの解説

| For each read operation, this value is added to the product of the
| ReadTotalTimeoutMultiplier member and the requested number of bytes.

に書かれた通りに、受信すべきデータ量に応じてReadFile一回分のタイムアウト
までの時間を増やす以上の意味はないと考えるのが自然でしょう。

# とかいいつつ、実は試したことはないのですが。

ReadTotalTimeoutMultiplierによるタイムアウト増分が、実際に読み込んだ文字数に
影響されるか否かは、読み込むべきバイト数を変えながら、ReadFileで何度か
タイムアウトを起こして (1文字も受信させない) みれば分かると思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加