機器とのシリアル通信をテラタームで行っています。
この機器の入力送信モードに入るためには、テラターム上でCtrl+kを押す必要があります。
このとき、機器へはどのようなデータがおくられているのでしょうか?
テラタームを使わずに送信しようとしています。そこで、キー「Ctrl」「k」をバイナリーで送信してみましたが、入力送信モードにはいることができませんでした。バイナリーでの送信は、単純に「Ctrl」「k」を順に送っているだけで、テラタームで「Ctrl+k」を押したとき送信される情報とは違っているのではと推測しています。ただそのバイナリー情報は何にあたるのかがわからないでいます。ご教授お願いします。

A 回答 (1件)

[CNTL]+英字 はAから順に01h~の1バイト文字が送られていたと思います。


[CNTL]+[K] では 0Bh - VT が送られると思います。
参考1 http://e-words.jp/p/r-ascii.html
参考2 http://d.hatena.ne.jp/shin_q/20110722/1311309277
    • good
    • 0
この回答へのお礼

ありがとうございます。
ばっちりできました!
また質問の際にはよろしくお願いいたします。

お礼日時:2012/06/09 02:06

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

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

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”を送信
かな?

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ポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて
いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな
いといけないと...続きを読む

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店でした。

QVBA & easycomm で長時間測定の問題

エクセルVBAとフリーソフトeasycommで複数同一機種の測定器からデータを吸い上げてエクセルに張り付けるプログラムを組んでいます。実験で使うので、体裁はどうでも良いですが、1秒おきのデータを1日程度取りたいです。
下記のプログラムを作ったのですが、かなりの頻度でフリーズしてしまいます(汗)
数分の測定なら問題ないのですが・・・
どうすれば長時間安定して動作させられるかご教授ください! よろしくお願いします!

*******************************

For kai = 1 To kaisuu '測定回数がkaisuuに入ります

For dai = 1 To daisuu '測定台数がdaisuuに入ります

KOMU = KOMU1 + dai - 1 'KOMU1は1台目のCOMポートの番号で、それ以降はCOMは連続して接続されています

Application.EnableCancelKey = xlErrorHandler
On Error GoTo Esc_EXIT ' ESCキーが押されるまで繰り返す処理を記述

ec.COMn = KOMU ' COMを開く

ec.Setting = "4800,e,7,2" ' Baud Rate 4800 7bit 2stop Even
ec.HandShaking = ec.HANDSHAKEs.No ' ハンドシェイクなし
ec.Delimiter = ec.DELIMs.CrLf ' デリミタにCr/Lfを指定

ec.AsciiLine = "&Q/F" ' &Q/F というコマンドを測定器に送信

Q_F = ec.AsciiLine '受信内容を Q_F に格納

Dim EQU_WAKE As Variant
Dim EQU_WAKE2 As Variant
Dim TEN_WAKE As Variant

' ****************受信データの一部分だけを抜き出す*********************

EQU_WAKE = Split(Q_F, "=") 'Q_F を=で分けたものをEQU_WAKEとする

EQU_WAKE2 = EQU_WAKE(1) 'EQU_WAKE の 2番目の文字列を EQU_WAKE2 とする

TEN_WAKE = Split(EQU_WAKE2, ",") 'EQU_WAKE2 を , で分けた文字列を TEN_WAKE とする
'*********************************************************************

Cells(kai + 6, dai + 2) = TEN_WAKE(0) ' 欲しいデータを縦軸に回数、横軸に台数にわけて張り付けていく

ec.COMn = 0 ' すべてのポートを閉じる

ec.WAITmS = 1000 '測定間隔を1秒にする

Next

Next

Esc_EXIT: '押された後の処理
ec.COMn = 0 ' すべてのポートを閉じる

エクセルVBAとフリーソフトeasycommで複数同一機種の測定器からデータを吸い上げてエクセルに張り付けるプログラムを組んでいます。実験で使うので、体裁はどうでも良いですが、1秒おきのデータを1日程度取りたいです。
下記のプログラムを作ったのですが、かなりの頻度でフリーズしてしまいます(汗)
数分の測定なら問題ないのですが・・・
どうすれば長時間安定して動作させられるかご教授ください! よろしくお願いします!

*******************************

For kai = 1 T...続きを読む

Aベストアンサー

エクセルのバージョンが古ければ、行数の制限に引っかかっている可能性はあります。
ファイルに書き出すには、何通りかの方法があります。

VBAを起動させ、ツールの参照設定で、
microsoft scripting runtime にチェックをいれ、

最初(ループの外)に
Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("C:\Documents and Settings\All Users\デスクトップ\test.txt", ForAppending, True)
などと書いてておき、(ダブルクオート内はパス付きファイル名)

Cells(kai + 6, dai + 2) = TEN_WAKE(0) ' 欲しいデータを縦軸に回数、横軸に台数にわけて張り付けていく
の代わりに

ts.WriteLine kai & vbtab & dai & vbtab & TEN_WAKE(0)

最後に(ループの外で)
ts.close
Set ts = Nothing

とでもすれば、タブ区切りでデータを書いていくことができます。
CSV区切りなどにしたければ、ts.writelineの行をそのように変えればよいだけです。
このように変更して落ちなければ多分エクセルの行数制限に引っかかっているのだと思います。

書かれたデータを、何に、どのように読み込むかはまた、別問題です。

エクセルのバージョンが古ければ、行数の制限に引っかかっている可能性はあります。
ファイルに書き出すには、何通りかの方法があります。

VBAを起動させ、ツールの参照設定で、
microsoft scripting runtime にチェックをいれ、

最初(ループの外)に
Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("C:\Documents and Settings\All Users\デスクトップ\test.txt", ForAppending, True)
などと書いてておき、(ダブルクオート内はパス付きファイル名)

Cells(kai + 6, d...続きを読む

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。


人気Q&Aランキング