ちょっと変わったマニアな作品が集結

RS232Cに接続された機械(Robot)をパソコンで制御するプログラムを書きたいのですが、それにあたり、シリアルポートの制御を主として記述している参考書(書籍)を探しています。
書店などでプログラミング教書を探しても、RS232に関して触れられている本はほとんど無く、あったとしても紹介程度のものです。
プログラミングソフトはVisualStudioExpressEditionsシリーズを予定しています。無料なので....
現時点で扱える言語はCとBASICだけです。
良い参考書があれば、VBやC#、C++等にもチャレンジしてみる意欲はあります。

何か、ハードウェア開発者(と言っても、今回はシリアルポート制御ですが..)でも理解できそうな比較的新しい書籍がありましたら、教えていただけると助かります。

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

A 回答 (1件)

Visual C# 2005 ですが、解説は丁寧ですから役に立つと思います。


http://www.robotsfx.com/robot/robohow/RoboHow60/ …
マイクロソフトによるVBの例
http://www.microsoft.com/japan/msdn/vbasic/migra …

本だとこの手の本ですかね。古いですから、VB2005じゃないです。
http://www.cqpub.co.jp/hanbai/books/36/36421.htm
アマゾンで探すと関連書籍が出てきますが、読んでみないと使える本は分かりません。
http://www.amazon.co.jp/VB%E3%81%A8%E8%A3%BD%E4% …

必要ないかもしれませんが、RS232Cの基本知識。
http://www.nahitech.com/nahitafu/mame/mame5/rs23 …
    • good
    • 1
この回答へのお礼

助かります。
ホームページを探していると、VBを使用した例が多いです。
しかしながら、VBは言語としての将来性に不安を感じている関係で手を出せずに居ました。
Visual C# 2005 の解説ページは活用させていただきます。
ありがとうございました。

お礼日時:2007/10/14 14:43

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

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

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

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

QVB2010で、シリアル通信の方法を教えてください。

VB2010で、シリアル通信の方法を教えてください。

ツールボックスの「Serial Port」を使っています。
送信までは難なくできたのですが、受信が旨くいきません。
参考にしたサイトは、
http://msdn.microsoft.com/ja-jp/library/cc720852.aspx です。

これを実行すると、受信が出来ないだけでなく、フリーズしてしまいます。

どうやったら、受信できるのでしょうか?

Aベストアンサー

受信データが、
STX(&H02)とETX(&H03)には挟まれた形式のテキスト文字になっている。
エラーチェックのBCCは付加されない。
という仕様ならば
ポートをOpenした直後に
SerialPort1.NewLine = Chr(3)
とすれば良い。
受信したデータの先頭1文字がSTXの場合に正常なデータと判断できます。

Qエクセル VBA でのCOMポート認識

エクセルのVBAを使用してあるアプリを作成しています。そのアプリはシリアルポートを使用してある機器と接続する事で実現できます。
そこで質問ですが、当該PCが認識しているCOMポートをVBAのSELECT BOXに表示したいのですがどうやれば(どのような関数?)を使用して実装COMポートを認識するのでしょうか?
もちろん、USB<--->シリアルケーブルを使用した場合もCOMポートだと認識しなければなりません。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

Windowsのプログラム(VBA含む)から、COMポートを扱う場合は、WindowsAPI を使用すれば可能
だと思います。

COMポートの実装チェックには、WindowsAPI の「CreateFile」関数でCOMポートのオープンを実行
して、その関数の戻り値がエラーかどうかを見れば判断できると思います。
ただし、COMポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて
いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな
いといけないと思います。

以下に、VBA から WindowsAPI (COMポート制御関連を含む)を利用するに当たって、参考になり
そうなサイトを上げてみました。宜しければ覗いてみて下さい。

■参考サイト
注)リンク切れの際は御容赦下さい。

1)VBAでWindowsAPIを使用してシリアル通信を行う方法

◎WindowsAPI講座
http://www.serpress.co.jp/winapi/
・このページよりリンクされている下記項目「シリアル通信(1)~(4)」のページでVBAから通信関連の
 APIを使用する方法が書かれています。
 NO.12 シリアル通信(1) ←必要なWindowAPI定義の説明
 NO.13 シリアル通信(2) ←シリアルポートのオープンとクローズを説明
 NO.14 シリアル通信(3) ←シリアルポートの通信プロトコル、送受信バッファ、タイムアウトの設定
 NO.15 シリアル通信(4) ←シリアルポートの送受信方法を説明
・今回の場合は、
   シリアルポートのオープン → 存在有無チェック → シリアルポートのクローズ
 までを行えば良いようなので、シリアル通信(1)~(2) までを参照すれば良いと思います。

2)CreateFile関数でCOM10以上のCOMポートを使用する際の注意点

◎CreateFile関数(Win32API)でCOM10以上を使う場合の注意点
http://www.aofactory.net/log/eid328.html
・ここで、API関数「CreateFile」で指定するCOMポート名(COM1、COM2など)に「COM10」以上を使用
 する場合の問題点および対策が書かれています。
・指定するCOMポートのデバイス名の頭に "\\.\" を付ければ良いようです。
   VBAでの指定例: "COM10" の場合は、 "\\.\COM10" とする。

3)WindowsAPI利用でCOMポートの存在有無をチェックする方法

◎COMポートが存在するかどうかを調べるには? - OKWaveの過去ログより
http://okwave.jp/qa4033242.html
・ここで、API関数「CreateFile」が失敗した際に、同じくAPI関数「GetLastError」でエラーコードを見て
 COMポートの存在有無を調べる旨が書かれています。
注)ただし、VBAでは「GetLastError」を呼んでもエラーコードが得られない可能性があるので、下記4)
 の方法を採った方が良いようです。

4)VBA から Windows API を利用する方法など

◎Office VBA と Windows API - Microsoft MSDN より
http://msdn.microsoft.com/ja-jp/library/cc326057.aspx
・このページの「エラー情報の取得」の説明で、VBAからWindowsAPIを呼出した際のエラーコードの取得
 方法が書かれています。
・VBAからWindowsAPIのDLLを呼び出した際のエラー情報は、「GetLastError関数」では取得できない
 可能性があるので、VBAの場合は「Errオブジェクト」の「LastDLLErrorプロパティ」でエラーコードを取得
 すれば良いようです。
・今回の場合は、COMポートオープン時のエラーコード取得に、この方法が利用できると思います。

こんにちは。

Windowsのプログラム(VBA含む)から、COMポートを扱う場合は、WindowsAPI を使用すれば可能
だと思います。

COMポートの実装チェックには、WindowsAPI の「CreateFile」関数でCOMポートのオープンを実行
して、その関数の戻り値がエラーかどうかを見れば判断できると思います。
ただし、COMポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて
いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな
いといけないと...続きを読む

Qプロトコルの決め方(RS232C)

VB6.0を使用して、画像処理プログラムの開発を行っているのですが、処理結果を別機器(PLC)へ送信しなければならなくなりました。漠然とRS232Cでデータ通信を行おうと考えてたのですが、上司から「まずプロトコルを決めないと、232Cもクソもないやろ」と怒鳴られました。232Cの使用を前提として、プロトコルを決めたいと思うのですが、上司に説明する文書としてどのような書式を用いればよいのか見当がつきません。(トホホ明日中に説明しろと言われております)
VBと別機器の動作としては、別機器からスタート信号をもらい、PCで画像撮像・処理を行い、処理データ(小数点以下3位程度×2個)を別機器へ送信するといったものです。
上記動作そのものが「プロトコルを決める」ということではありませんよね?スタート信号や処理完了信号の文字を決定するところまでを含めて「プロトコルを決める」ということなのでしょうか?
アプリケーションとしては複雑なものではないのですが、いかんせん基本が分かっていないので、私の説明も理解していただき難いものがあるかと思います。上記動作のアプリケーションに似たプロトコルのサンプル文書があれば非常に助かるのですが。。。
よろしくお願い致します。

VB6.0を使用して、画像処理プログラムの開発を行っているのですが、処理結果を別機器(PLC)へ送信しなければならなくなりました。漠然とRS232Cでデータ通信を行おうと考えてたのですが、上司から「まずプロトコルを決めないと、232Cもクソもないやろ」と怒鳴られました。232Cの使用を前提として、プロトコルを決めたいと思うのですが、上司に説明する文書としてどのような書式を用いればよいのか見当がつきません。(トホホ明日中に説明しろと言われております)
VBと別機器の動作としては、別機器からスタート信号...続きを読む

Aベストアンサー

http://www.fukufukudenshi.com/LineMonitor/RS-232C.html

とりあえず、これを読んでみてください。
上司の方もあなたも「プロトコル」を勘違いしています。
RS-232Cを使うと決めたのであれば、ハードウェアよりのレイヤ(1と2かな?)の「プロトコル」を決めたことになります。
あとは、ソフトウェアよりのレイヤの「プロトコル」を決めればよいのです。
上のURLを参照していただければわかりますが、パソコンのCOMポートは同期通信をサポートしていませんので、ASYNC(非同期通信)しかありえません。
ので、スタートビット・ストップビット・パリティビット等を決めれば環境が整います。
非同期通信ですから、勝手にデータが流れます。

さて、ここで問題があります。
非同期通信しかサポートしていませんから、どうにかして「ハンドシェイク」しなくてはいけません。
ここで上司の期待している「プロトコル」の出番です。
「データ送信開始」コマンドはどうする?
「データ送信終了」コマンドはどうする?
「相手機器と【ちゃんと受け取れた】かの確認」はどのようにする?
などなど、山盛りあります。通信相手の仕様に依存するので、
サンプル文書はないと思います。しいていうなら、相手機器の通信機能マニュアルになるとおもいます。

http://www.fukufukudenshi.com/LineMonitor/RS-232C.html

とりあえず、これを読んでみてください。
上司の方もあなたも「プロトコル」を勘違いしています。
RS-232Cを使うと決めたのであれば、ハードウェアよりのレイヤ(1と2かな?)の「プロトコル」を決めたことになります。
あとは、ソフトウェアよりのレイヤの「プロトコル」を決めればよいのです。
上のURLを参照していただければわかりますが、パソコンのCOMポートは同期通信をサポートしていませんので、ASYNC(非同期通信)しかありえません。
ので...続きを読む

QVBA EasyCommでの送信

文字列を送信する場合は ec.Ascii = "mojiretsu" を送ればよいというのはわかるのですが、例えばキーの'Ctrl'を押すのと同等の命令送信をしたいのですが、この場合どのようにコードを書けばよいか教えていただきたいです。できれば、Altの場合なども教えていただけると助かります。

Aベストアンサー

http://okwave.jp/answer/new?qid=7507694
こちらを参考にすれば
ec.Binary = 17 'Ctrlキーのコード“17”を送信
ec.Binary = 18 'Altキーのコード“18”を送信
かな?

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QエクセルVBAでRS232通信は可能ですか?

VBAでシリアル通信したいのです。
VBでは下の検索結果にあるようにmscommが使えます。
VBAではmscommが使えませんでした。制限があるのでしょうか?
VBAで行う方法をご存知の方教えてください。

http://www.okweb.ne.jp/search.php3?dummy=%83%81%81%5B%83%8B&c=218&kw=mscomm

Aベストアンサー

トランジスタ技術という雑誌があります
過去に何度か取り上げられている記事の中で
木下隆さんの記事があります
下記のURLが参考になると思います

参考URL:http://activecell.cool.ne.jp/easycomm/index.htm

Qプログラム設計書の書き方

僕は新人SEです。
今、上司の方からあるシステムの基本設計書・システム設計書・プログラム設計書を作り、プログラミングまでしてから単体テスト・結合テストもやるように言われています。(全て1人で)

おそらく経験のある方ならすぐにできてしまうようなシステムで、上司の方も勉強のために全てやらせているようです。

今、基本設計書・システム設計書まではなんとかできて、プログラム設計書の作成に取り掛かりたいのですが、初めての経験で実際のプログラム設計書には何をどのように書いているものなのかも全く見当もつかずにいるので全く何も書けません。

上司さんは今週忙しいようで
「来週見てあげるから自分で調べたりしてやってみて」
と言っています。
ですが、全く何もできずにいるのもイヤなので何かそれらしいものでも書いてみたいのですが…プログラム設計書とは何をどう書いてあるものなのでしょうか?

日本語が書いてあるのかプログラムが書いてあるものなのか…
そういったところからわからないので少しでも何か教えていただきたいです。
宜しくお願いします。

Aベストアンサー

こんにちは。
No.1様のご回答通りなのですが会社によって異なります。
というのを踏まえた上で・・・うちではという回答になりますが

・日付 2009/10/10
・版 初版(その後バージョンアップで改定するため、改定ナンバー必須)
・タイトル 企業情報印刷(ここでは決定済み名称)
・発注仕様書ナンバー(正式にお客さまと契約で決めた発注番号を記載)
・作成者 boo_boo_suu
・使用言語 Visual C++
・使用データベース ORACLE
・使用帳票アプリケーション Crystal Reports
・フロー図(Visioで埋め込み図)
・概要説明 
メインメニューから呼び出され企業情報の印刷条件を入力し、クリスタルレポートの帳票情報から企業情報ファイル(KIGYOU_INFO)ファイルを呼び出し印字します。
・全企業情報が一覧で印字可能である。
・特定一企業(企業コード指定)での印字も可能である。
・一企業が指定された場合は企業情報を画面表示する。

-----------------------------------
で・・・・プログラム仕様書はこのくらい。
命令書ですからコードそのものは打ちません。
これみて作ってもらわないといけないので日本語メインです。

あとはDBの仕様書をみてもらったりしてプログラムのローカルルール、画面サイズ、文字サイズ プロシージャ定義やら定数や変数、フォーム、構造体定義書などプログラム書くときの決まりごとに添ってPGさんに打ってもらっています。
一応、図とかつけてみました。(^-^;;
全体の雰囲気はこんな感じだとご理解いただければ幸いです。
ではでは~。

こんにちは。
No.1様のご回答通りなのですが会社によって異なります。
というのを踏まえた上で・・・うちではという回答になりますが

・日付 2009/10/10
・版 初版(その後バージョンアップで改定するため、改定ナンバー必須)
・タイトル 企業情報印刷(ここでは決定済み名称)
・発注仕様書ナンバー(正式にお客さまと契約で決めた発注番号を記載)
・作成者 boo_boo_suu
・使用言語 Visual C++
・使用データベース ORACLE
・使用帳票アプリケーション Crystal Reports
・フロー図(Visioで...続きを読む

QRS-232Cでバイナリデータを受信する方法

2台のPCを使用しバイナリファイルをRS232Cを使用し1台目のPCは送信専用、2台目のPCは受信専用で、送信側のPCから出したデータを受信側PCでデータの内容を判断し集計するプログラムを作ろうとしています。

送信側のPCでは、"AAB9AAC2AACC01D8AAE2・・・”といった内容のバイナリファイルの内容を1バイトずつ読み込み、それをMsCommを用いてバイナリモードで送信させて、EOFになるまで永遠とそれを繰り返します。

問題は受信側で、たとえば上記のデータの中の"AAB9"ならばカウントを1つ上げる、"AACC01D8"ならばカウントを1つ下げ、それを表示するといったような処理をリアルタイムで行いたいのですが、どうしてもデータの取りこぼしが発生します。

また、データの意味合いとしては、必ず"AA"という1バイトのデータから始まり、それに1バイトから5バイトまでのデータが可変長で付いてきて次の"AA"までが1つの意味となります。

通信パラメータは9600、8ビット、ストップビット1、パリティなしで、その他の制御線は一切使用しないという条件です(要するにRxD、GND線のみの最低限の条件)

受信側のバッファは1024バイトで、MSComm1.RThreshold = 1でOnCommを発生させています。また、送信側のファイルの大きさは1kバイトほどです

正直なところ、このようなことが可能なのかどうかもわからない状況なのですが、現状ではデータを数バイト取りこぼしているだけのようなのでできないことはないのではないか?と考えています。

どなたか、参考文献、ホームページ、プログラム、考え方等を何でもかまいませんん!ぜひ、ご教授願います!!また、現在はVBにて開発中ですが、最悪、言語は問いません。よろしくお願いいたします。

2台のPCを使用しバイナリファイルをRS232Cを使用し1台目のPCは送信専用、2台目のPCは受信専用で、送信側のPCから出したデータを受信側PCでデータの内容を判断し集計するプログラムを作ろうとしています。

送信側のPCでは、"AAB9AAC2AACC01D8AAE2・・・”といった内容のバイナリファイルの内容を1バイトずつ読み込み、それをMsCommを用いてバイナリモードで送信させて、EOFになるまで永遠とそれを繰り返します。

問題は受信側で、たとえば上記のデータの中の"AAB9"ならばカウントを1つ上げる、"AACC01D8"なら...続きを読む

Aベストアンサー

たしか.1秒に1回100msほど.タイマー関連の処理に取られて.結構速度を落とさないと.取りこぼしが発生するようです。

私の関係した対応では.
バッファを巨大にする
転送速度を4800に落とす
受信ソフトの実行速度をあげるため.受信中は他の仕事をさせない
の3店でした。

QVccとVddの違い

トランジスタのバイアス電圧などでよくVccとかVddとかかかれているのをみます。
Vccのccとは何の略で、Vddのddとは何の略なのでしょうか?
また使い分け方を教えて下さい。

Aベストアンサー

cはコレクタ,dはドレインの略です.
Vcと表記すると該当のトランジスタ1個のコレクタ電圧を指しますよね.
Vccという表記は,それと明確に区別するために使われていると思います.
ccで,複数のトランジスタのコレクタを意味しているのでしょう.
つまり,ccは「コレクタ側電圧(電源)」,ddは「ドレイン側電圧(電源)」
と考えればよいでしょう.
ちなみに,Veeでエミッタ側のマイナス電源(NPNの場合)を表します.
それと,ccとかddとかは,大文字でCC,DDと表記することが決まっている
はすです.小文字の場合は「小信号」を意味するからです.
IEEEやJEDECで表記の規則が手に入るはずです.


人気Q&Aランキング