VISUALC初心者です。実際Cも良く分かってないと思います。パソコンにも詳しくないです。
シリアルポートにデータを送るプログラムをVISUALCで作りたいんですが、何をやって良いかさっぱり分かりません。
仕様はダイアログベースで、ボタンを押すと、エディットボックスに書いたファイルパスのファイルのデータをRS232Cに送るということをやりたいのですが、全くもって分かりません。

ファイルの指定の仕方。
および一ビットずつシリアルポートに転送の仕方。
のすべてを教えてください。
以下を参考にしていますが、やっぱり良く分からないというのが現状です。
http://www2.muroran-it.ac.jp/circle/yume/serialp …

このQ&Aに関連する最新のQ&A

A 回答 (4件)

#専門家ではなく、「一般人」ですが。

。。

補足に書かれたことについてコメントします。

WriteFile()の第2パラメータにハンドルを渡しています。
#エラーにならないのかな???
WriteFile()の前にReadFile()でファイルからデータをメモリ上に読み込んで、
そのアドレスを第2パラメータに渡す必要があると思います。
ファイルデータが固定長ならば予めリードするデータの領域を
確保しといてもいいし、データ長が不定ならGetFileSize()で
得たサイズをアロケートすればいいと思います。
間違ってたらごめんなさい。
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決しました。

プログラムの知識ももちろんのこと、コンピュータの知識なども勉強しなければならないという事を痛感しております。
またお世話になるかと思います。そのときはよろしくお願いします。

お礼日時:2001/11/07 19:57

 WIN2000なら、「WINDOWS2000デバイスドライバ入門」(CQ出版社:2500円)に、シリアルポート制御の解説がはじめの方に載ってます。

私は勉強になりました。

この回答への補足

皆様本当にありがとうございます。

少し分かってきたので、また質問させてください。

fileHANDLE = CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
として、232Cに送りたいデータのあるファイルを開いて、
GetFileSize(fileHANDLE,NULL);
として、そのファイルのサイズを得て、

BOOL WriteFile(
HANDLE hFile, // COM1のハンドル
LPCVOID fileHANDLE, // データのあるファイルハンドル
DWORD nNumberOfBytesToWrite, // GetFileSizeで得たバイト数
LPDWORD lpNumberOfBytesWritten, // 書き込んだバイト数
LPOVERLAPPED lpOverlapped // NULL
);

としてWriteFileを用いたいのですが、それは可能でしょうか?
やってみたところ、書き込んだバイト数が0となってしまいます。
根本的に間違っているのでしょうか?
よろしくおねがいします。

VCでやらねばなりません。
ヒントでもなんでもかまわないので分かるかた、お願いします。

補足日時:2001/11/05 16:29
    • good
    • 0
この回答へのお礼

すいません補足ではなくお礼に書くべきでした。
教えてgooの使い方がよくわからなかったもので。
おそくなりましたがありがとうございました。

お礼日時:2001/11/07 19:53

C言語に詳しくない上に、パソコンにも詳しくないとすれば、


VCよりもまずVBから入られた方がいいかと思います。
もっともVCでプログラミングしなければならない理由があるのなら別ですが。

参考にされているURLは、Cに詳しくない方にはきついと思います。
私もCに詳しくないので、よくわかりませんでした。
参考にするのなら、サンプルプログラムが豊富なサイトの方がいいかと。

私はRS-232Cでのデータのやり取りをVBで作っています。
RS-232C関連の本は非常に少ないですが、何とか見つけたのが以下の本です。

技術評論社「自動計測システムのためのVB6入門」金藤 仁著
ISBN4-7741-0940-1 \3,200(税別)

この本にはRS-232C、GP-IBのサンプルPGMがいくつか載っており、
CD-ROMもついています。

雑誌でなく、本で出ているもので、私が見つけたのはこれだけでした。
お役にたてば幸いです。

あと、文化オリエント社のPDQ Commを使うと、RS-232CによるCOMポートの
PGMはもっと簡単になります。このマニュアルにもサンプルPGMがあります。
    • good
    • 0
この回答へのお礼

おそくなりましたが、ありがとうございました。

お礼日時:2001/11/07 19:52

何もかも教えてくれということでは、プログラム関係は回答は得られませんよ。


上記のURLを見ましたが、APIを詳しく示していますよね。
でしたら、そのAPIをどのようにして使うか、検索エンジンを使って
調べるのが一番早いですよ。

勉強のWebページとして「猫でもわかるプログラミング」のURLを示します。
ご参考あれ。

参考URL:http://www2m.biglobe.ne.jp/~yasutaka/
    • good
    • 0
この回答へのお礼

おそくなりましたが、ありがとうございました。

お礼日時:2001/11/07 19:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRS232Cシリアル通信について

現在VC6++でRS232Cの通信プログラムの機能の追加をしている(元は違う人が製造)のですが、一部わからない部分がありました。

RS232Cを使用して電文全てログファイル出力したいのですが、
//送信
aaa = WriteFile( bbb, (UCHAR *)ccc, ddd, &eee, NULL);

//受信
aaa = ReadFile( bbb, (UCHAR *)ccc, ddd, &eee, NULL);

の様に記述がしてあり、そのすぐ後ろにログファイルを出力する記述
PrintLF((CHAR *)ccc);  //PrintLF・・・引数をファイルに出力する関数

を書いています。

(1)PrintLFの引数はunsigned charではない為PrintLF((CHAR *)ccc);と記述しましたがこれでよろしいでしょうか?(文字化けなどはしない?)

(2)電文全てログファイル出力したいとなると、WriteFi・ReadFileのすぐ後にログ出力の記述(第2引数を出力)してあげればよろしいでしょうか?

(3)実際にテストが出来ない為、いいソフトはないでしょうか?

以上ですがよろしくお願いいたします。

現在VC6++でRS232Cの通信プログラムの機能の追加をしている(元は違う人が製造)のですが、一部わからない部分がありました。

RS232Cを使用して電文全てログファイル出力したいのですが、
//送信
aaa = WriteFile( bbb, (UCHAR *)ccc, ddd, &eee, NULL);

//受信
aaa = ReadFile( bbb, (UCHAR *)ccc, ddd, &eee, NULL);

の様に記述がしてあり、そのすぐ後ろにログファイルを出力する記述
PrintLF((CHAR *)ccc);  //PrintLF・・・引数をファイルに出力する関数

を書いています。

(1)PrintLFの...続きを読む

Aベストアンサー

> (1)PrintLFの引数はunsigned charではない為PrintLF((CHAR *)ccc);と記述しましたがこれでよろしいでしょうか?(文字化けなどはしない?)

PrintLFの仕様がわからないのでどうしようもありません。

> (2)電文全てログファイル出力したいとなると、WriteFi・ReadFileのすぐ後にログ出力の記述(第2引数を出力)してあげればよろしいでしょうか?

バッファを他のスレッドと共有していないのであれば、おそらくそれで問題ないと思います。

> (3)実際にテストが出来ない為、いいソフトはないでしょうか?

どんなテストがしたいのかにもよりますが、文字ベースでよければハイパーターミナルで十分でしょう。

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

Linuxでパソコンから他の機器へ文字列を送るプログラムを書きたいと思っています。
termios.h というヘッダーがあると言うことは検索して分かったのですが、それ以上に詳しいことがよく分かりません。
Linuxでシリアル通信をするC言語のプログラミングを扱っている書籍や詳しいサイトがあれば教えて頂きたく思います。

また、C言語のヘッダーは自分が勉強した本に載っているものは分かるのですが、それ以外のものはどうやって調べられているのでしょうか?
自分が求めている機能のライブラリがあるかどうかは、Googleとかで調べておられるのでしょうか?
termios.hというようなヘッダーについては、どうやって情報を集められているのでしょう?

よろしくお願い致します。

Aベストアンサー

これとか参考になるかと。
古くからあるドキュメントですが、基本的に変わってないので。
もしかすると、もっとお手軽に使えるフレームワークがQtやJavaあたりにありそうですが。

参考URL:http://www.linux.or.jp/JF/JFdocs/Serial-Programming-HOWTO.html

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

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

もし、ご存知でしたらよろしくお願い致します。

Aベストアンサー

参考URLを書いておきます。

Linuxでもシリアル通信をやりたいようですので、そんな場合、面倒くさがり屋の私はTclを使っています。(http://www.freesoftnet.co.jp/tclkits/doc/TclCmdRef/TclCmd/fconfigure_jp.htm)

参考URL:http://members.jcom.home.ne.jp/0434383301/vc10.htm

QRS232Cを用いたSCIでのシリアル通信について

PCで計算して吐き出した5~6個の数値データ(それぞれ3桁の数字で最大2バイトあれば足りる大きさです)をRS232Cを使ってSCIでマイコンに送り、マイコン側でそのデータを使って計算する、というシステムを考えています。

色々勉強してみたのですが、例えばPC側プログラムがテキストデータで吐き出した数値を読み込んで送信する場合、全てアスキーコードで送られてしまうのでしょうか?少なくともキーボード入力の値はアスキーコードで送られているようだとはわかりましたが・・・。
また、まだアルゴリズムは考えてませんが、PC側の計算プログラムから直接に数値をPC側送信プログラムに渡してあげた場合は、やはりそのままの値(例えば8なら1バイト2進法で00001000で送られるものなのでしょうか?

開発環境はC言語で、マイコンはSH2だということです。通信は今はテスト段階でハイパーターミナルを使っていますが、いずれは命令を出したときに適切な値を送信するようにしたいので、C言語で書かれたSCI通信のフリーウェアなどを使う検討もしています。
その理由はC言語プログラムの中にハイパーターミナルをどのように含めればいいのかわからなくて・・・
C言語でできたソフトなら、そのままPC側計算プログラムに組み込めばいいかなぁと思いまして・・・。(浅はか?)
この点についてもご教授頂ければ幸いです。

説明不足かもしれませんが、その場合はご指摘ください。
どうぞ、宜しくお願いいたします。

PCで計算して吐き出した5~6個の数値データ(それぞれ3桁の数字で最大2バイトあれば足りる大きさです)をRS232Cを使ってSCIでマイコンに送り、マイコン側でそのデータを使って計算する、というシステムを考えています。

色々勉強してみたのですが、例えばPC側プログラムがテキストデータで吐き出した数値を読み込んで送信する場合、全てアスキーコードで送られてしまうのでしょうか?少なくともキーボード入力の値はアスキーコードで送られているようだとはわかりましたが・・・。
また、まだアルゴリズムは考...続きを読む

Aベストアンサー

1.データの形式
文字列としても二進法としても送ることができます.

PC側がテキストとして数値を投げた場合には, 文字として数値が渡されること
になります. 送信側で数値→文字列の変換, 受信側で文字列→数値の変換が必
要となります. これをアスキー形式といいます. データは"8" などと, そ
のまま数字の文字列で送信されます.

一方, PC側が数値をテキスト化しないで送った場合には, 2進数のビット列が
そのまま送信されます. これをバイナリ形式といいます. 8なら. '00001000'
などとなります.

アスキー形式は1桁1文字(=8bit)で数値を表すので, データ量が多くなりがち
である欠点があります. 逆に, バイナリ形式はデータの開始, 終了をどのように
表すかという点で工夫が必要です. (考えてみてください)

どちらも一長一短ではありますが, 質問の件のようなそれほどデータ量の
多くないシステムであれば, アスキー形式にしておけば楽でよいかもしれません.


2.ターミナル?
C言語とおっしゃるのが, PC側のアプリケーションの話なのかSH2側の組み込み
アプリのことなのかよくわかりませんが, PC側のことであれば, COMポート
(RS232) を使ってデータの送受信を行うライブラリなどがありますから,
そういったものを利用します. ハイパーターミナルはあまり関係ありません.

フリーウェアの件ですが, それはソースコードが公開されているという意味
ですよね? 単にアプリケーションを拾ってきただけだと「組み込む」のは
ムズカシイと思いますが・・・


※ところで, SCIってのは"H8やSH2のシリアル通信機能"の名前ですよね.
一般的な言い方をするなら単にシリアル通信とか, RS232とか, UARTなんて
呼び方の方がいいかもしれません.
SCIって検索かけてもパソコン上で役に立ちそうな話はでてこないのではないですか.

1.データの形式
文字列としても二進法としても送ることができます.

PC側がテキストとして数値を投げた場合には, 文字として数値が渡されること
になります. 送信側で数値→文字列の変換, 受信側で文字列→数値の変換が必
要となります. これをアスキー形式といいます. データは"8" などと, そ
のまま数字の文字列で送信されます.

一方, PC側が数値をテキスト化しないで送った場合には, 2進数のビット列が
そのまま送信されます. これをバイナリ形式といいます. 8なら. '00001000'
などとなります.

ア...続きを読む

Q同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへDrag&Dropすると
テキストが消えてしまう現象に悩んでいます。

現在、
下記のサイト
http://www.softist.com/programming/dandd/dandd.htm
のサンプルプログラムを参考に
コントロール間のDrag&Dropの仕方を学習しています。

このサンプルではエディットボックス間で文字列のコピーができるようになっていますが、
私がほしい機能は文字列の移動です。
そこで、サンプルのEditForDD.cppの
DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY);
の下に、
if(DropEffect == DROPEFFECT_COPY) this->SetWindowTextA("");
という一文を加えて、Drag&Dropする際にDrag元のテキストを削除するようにしました。
その結果、異なるエディットボックス間での移動は可能になりましたが、
Drag元のエディットボックスにテキストを戻そうとすると
テキストが消えてしまいまうようになってしまいました。

このように同じエディットボックスにDrag&Dropをしても
テキストが消えないようにする方法をご存じの方はいらっしゃいませんでしょうか?

なお、開発環境は以下の通りです。

開発環境:Visual Studio 2005 Standard Edition
利用言語:VC++/MFC
OS:Windows XP

よろしくお願いいたします。

同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへDrag&Dropすると
テキストが消えてしまう現象に悩んでいます。

現在、
下記のサイト
http://www.softist.com/programming/dandd/dandd.htm
のサンプルプログラムを参考に
コントロール間のDrag&Dropの仕方を学習しています。

このサンプルではエディットボックス間で文字列のコピーができるようになっていますが、
私がほしい機能は文字列の移動です。
そこで、サンプルのEditForDD.cppの
DROPEFFECT DropEffect = OleDa...続きを読む

Aベストアンサー

Revokeをして同じエディットボックスにはDrop出来ないようにし
Drag&Drop後に再びRegisterをしてはどうでしょうか?

m_DropTarget.Revoke(); //追加
DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY); //DROPEFFECT_SCROLL
if(DropEffect == DROPEFFECT_COPY)
this->SetWindowTextA("");
m_DropTarget.Register(this); //追加


人気Q&Aランキング

おすすめ情報