VBへの変換の仕方 RS232C送信データとチェックサム

このQ&Aのポイント
  • 質問内容: 以下のプログラムをVBに変換する仕方を教えてください。サンプルプログラム 1110 CHKSUM=0 1120 FOR i=1 to LEN(A$) 'A$は送信データ 1130 CHKSUM=CHKSUM+ASC(MID$(A$,i,1) 1140 NEXT i 1150 C$=CHR$((CHKSUM+13) MOD 256) 1160 PRINT #1,A$;CHR$(13);C$; 私のVBプログラムは1110行から1150行まではそのままで CHKSUM=0 FOR i=1 TO LEN(A$) CHKSUM=CHKSUM+ASC(MID$(A$,i,1) NEXT i C$=CHR$((CHKSUM+13) MOD 256) としました。 送信部分を MSComm1.Output =A$ & CHR$(&H13) & C$ としてみましたが 1160行にあるセミコロン ";" はCHR$(&h3B) として送る必要があるのでしょうか? MSComm1.Output =A$ & CHR$(&h3B) & CHR$(&h13) ・・・・・・ また、データとしてA$="I 02"のチェックサムは "リ" となりますが正しいのでしょうか? 以上ご教示ください。
  • VBへの変換方法についての質問です。質問文中のプログラムをVBに変換する方法を教えてください。また、送信部分でセミコロンの代わりにCHR$(&h3B)を使う必要があるのか、データとしてA$="I 02"のチェックサムが正しいかについても教えてください。
  • VBへの変換方法について教えてください。質問文中のプログラムをVBに変換する方法を教えてください。また、送信部分でセミコロンの代わりにCHR$(&h3B)を使う必要があるのか、A$="I 02"のチェックサムが正しいかについても教えてください。
回答を見る
  • ベストアンサー

VBへの変換の仕方 RS232C送信データとチェックサム

以下のプログラムをVBに変換する仕方を教えてください。 サンプルプログラム 1110 CHKSUM=0 1120 FOR i=1 to LEN(A$)      'A$は送信データ 1130 CHKSUM=CHKSUM+ASC(MID$(A$,i,1) 1140 NEXT i 1150 C$=CHR$((CHKSUM+13) MOD 256) 1160 PRINT #1,A$;CHR$(13);C$; 私のVBプログラムは1110行から1150行まではそのままで CHKSUM=0 FOR i=1 TO LEN(A$) CHKSUM=CHKSUM+ASC(MID$(A$,i,1) NEXT i C$=CHR$((CHKSUM+13) MOD 256) としました。 送信部分を MSComm1.Output =A$ & CHR$(&H13) & C$ としてみましたが 1160行にあるセミコロン ";" はCHR$(&h3B) として送る必要があるのでしょうか? MSComm1.Output =A$ & CHR$(&h3B) & CHR$(&h13) ・・・・・・ また、データとしてA$="I 02"のチェックサムは "リ" となりますが正しいのでしょうか? 以上ご教示ください。

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

  • ベストアンサー
  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

VBのバージョンは? 新しいものであれば内部はUniCode化されていると思うので昔のソースを移行するのは大変と思う、特に半角文字を扱う場合は 送信データはStrConvでAsciiにしてバイト配列にしチェックサムは XOR演算したと思ったけど・・・ 偶数、奇数があるので最後に反転しないといけない場合もあるけど それとPrint文の;は続けて書く場合に使いますのでCHR$(&h3B) を付ける必要はありません Print "a","b" とすると a_______b となります_=Space また Print "a";"b"とすると ab となります Print "a" Print "b" なら a b Print "a"; Print "b" なら ab 通常送信データには改行を送らないので 最後の Print "b" も Print "b"; と書きます

lonvic
質問者

補足

ありがとう。 出力文中のコロン、セミコロン、カンマ はモニター表示形式と同じですよね。思い出しました。CHR$(&H13)は"CR" (&H0D) なので私の間違いでした。 どうもターゲット機器のサンプル通信プログラム仕様のバージョンが違う様で、コマンド自体も違っている様です。今日一日かけてコマンドを探るソフトを追加して応答が来るまで待ちます。皆さんありがとう。また宜しく。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

移植性を考えるなら Dim A$ → Dim A As String MID$(A$, i, 1) → Mid(A, i, 1) とすべきですね。これはVB.NET以降は型記号が使えないためです。 チェックサムは色々な形式があるので、何が正解かは「方式による」 としか言えません。Print文にある";"セミコロンは変換不要ですが、 ","はvbTabに変換し、後方に何も無い場合は最後にvbCrLfを追加する ようにします。 あと、CHR$(&H13)というのは独特の区切り記号なんですかねぇ? もしかしてキャリッジリターンのことあればvbCrにすべきです。

lonvic
質問者

補足

ありがとう。ターゲット機器のチェックサム計算式はサンプル通り。出力文のセミコロンは不要との事、了解。文法の件は了解。感謝。

関連するQ&A

  • VB6.0でのバイナリデータの扱いについて

    現在ハンディターミナル(HT)とPCとの通信を行うプログラム(VB6.0)を作成しています。 このプログラムは元々VB2.0で作成されたものをベースとしてVB6.0で再作成しているものです。 プログラムの中でHTとPCとの通信エラーを防ぐため、データ行のBCCを計算しHTに送信している 部分があります。VB6.0ソースを下に表示します。 (実際は、計算したBCCをデータ(下のCheckString変数)の最終行にくっつけてHTに送信していますが、ここではBCCのみ送信しています) -------------------------------------------------○VB6.0 /* 最初にBCCを計算して返し、HT側へ送信している */ /* BCCはstring */ Dim i As Integer, aa As Integer,BCC as String aa = 0 For i = 1 To Len(CheckString) aa = aa Xor Asc(Mid(CheckString, i, 1)) Next BCC = Chr$(aa) frmMain.MSComm1.InBufferCount = 0 frmMain.MSComm1.Output = BCC ------------------------------------------------ VB2.0ではAscB,LenB,MidBのところをVB6.0ではAscB,LenB,MidBをAsc,Len,Midへ変更しています。通常はこれで問題ありませんでしたが、BCCの計算の結果aa = 226となった場合にBCCに文字化けした"r"のような文字がはいっていました。プログラムの中でBCC変数をテキストへ吐き出し、バイナリエディタで確認しましたが"E2"となるところに"00"と空白となっており、これが原因でHTとPC間での通信が完了しません。 (テキスト送信時にStringのため文字化けが原因?) 前回の質問でSTRING型を使用せずにバイナリ型配列で処理する事や、いままで暗黙のうちにUnicode⇔SJIS変換を行ってくれていた部分をStrconvを使用し自前で処理しなければいけないというご指摘を受けたのですが、上のプログラムではどのように修正が必要なのでしょうか?どなたかご教授の程宜しくお願い致します。

  • RS-232Cのコマンドについて

    はじめまして。 RS-232C通信にて計測器からデータを取得します。 計測器の仕様では、 『呼び出しコマンドが「0x08」でデータが吐き出されます。 ハイパーターミナルで言えば、Ctrl + H のコマンドです。』 と記載されています。 VB6.0のMSCommコントロールを使用して、コマンドを送出して、データを得たいです。 この場合、コマンド送出はどのように記述すればよいのかわかりません。 MSComm.Output = "H" ← Hですか?? コマンドの意味を理解できていなくて、困っています。 初心者でお恥ずかしい質問ですが、教えてください。 宜しくお願いします。

  • 文字列からASCIIコードの取得方法

    お世話になっております。 やりたいのは、MSCommを使用しデータを送った時、 データのチェックをしたいのですが、Chr関数(値を151を入れる)で作った文字をAsc関数で戻すと値が0になってしまってチェックできません。 文字列で受け取ったデータをどのようにコード変換したらよいでしょうか? VBのバグなのか知りませんけど、 例えば、Asc(Chr$(151))、AscB(Chr$(151))は0を返し、AscB(ChrB$(151))だけが151を返します。 使用しているのは、 VB6SP4 Win2000です。 宜しくお願い致します。

  • rs232cでの受信データ(mscomm)の受信方法VB6

    VB6で、シリアル通信プログラムを作っています。 機器からレスポンスが、02 00 44 03 61 62 63 03 72 0Dと9バイトくるのですが、 8バイト受信した後に、また、最後の0Dを1バイト目として受信しているので困っています。 on commイベントで以下のようにして受信データをテキストボックスに表示しているのですが、 Select Case MSComm1.CommEvent   Case comEvReceive       Dim Buffer() As Byte       Buffer() = MSComm1.Input       For t = 0 To 6 + Buffer(3)  ,BUffer(3)はデータ長です。       Text1.Text = Text1.Text & Hex$(Buffer(t)) & Chr(&H3A)       Next t 8バイト表示した後、1バイト受信が起こるので、Buffer(3)が範囲外となりエラーが起こります。 inputLenは0にしています。 この問題は解決するにはどうしたらよいでしょうか? 0Dは終了コードです。0Dを受信するまで、きちんと1バイトづづ格納していくなどというようにできたらよいのですが、、、 他にも簡単な方法があったらよいのですが、、、 よろしくお願いいたします。

  • MSCommを用いたRS-232-Cデータ転送

    Visual Basic ver.6を用いてRS-232-Cデータ転送のプログラムを書いています。 転送には,MSComm controlを用いています。 コンピューター側から命令コードを測定器側に送信すると(例えば,MSComm1.OutPut = "F,3,300," & Chr(13)のように),測定器側からは次のようなテキストデータの転送が指定された回数だけ起こります: @C/R 数値データC/R 数値データC/R ・・・・ ・・・・ (指定回数繰り返す) そこで,質問ですが,このデータをMSComm1.Inputを介してきちんと取得する方法をお教えください。私がよく理解できいない部分は,「どのような形でbufferにデータが落ちているのか?」という部分と「繰り返し処理をどう記述するのか?」という部分です。多分後者は配列型変数を用いて「指定回数」だけ繰り返すことになると思いますが・・・・。 なお,データ転送の制御フォーマットはデータのみの転送で,STXもETXも使用していません。

  • XPでVBを使いRS232Cから5bpsでデータを出力する方法を教えて下さい。

    VBの初心者です。 VBを使いRS2322Cから5bpsでデータを出力したいと思っています。 98MEにてAPIのWriteFile()を使い成功したのですが、XPへ移行したとたんNGとなってしまいました。 MSComm1.Outputを使おうかとも思ったのですが最低ボーレイト110bpsまでで使えません。 何方かXPでRS2322Cから5bpsでデータを出力する方法をご存知の方がおられれば教えて下さい。

  • VB2005によるRS232C制御

    VB2005でZX-800L(TAKASAGO)を動かしたいのですがポートオープンできません。(オープンできるとREMOTOが点灯するはずなんですが…) 現在MSCommまたは確認の意味でNSPcomを用いています。(シリアルポートもあるんですができれば前者でやりたい) 機器の設定は何度も確認して間違いはないと思われます。(windowsXP使用)プログラムは以下です。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '<RS232C constant> STX = "02" EOT = "04" ENQ = "05" '伝送キャラクタ設定 ACK = "06" NAK = "15" ETX = "03" RTN = "0A" Comport = 1 OP = "9600,n,8,1" 'baud rate,stop bit,data bit,parity ADD = "01" 'RS232Cアドレス BC = "\" & EOT & ADD 'EOT+ADD Call ATH(BC) 'アスキー変換サブルーチンです。 EOTADD = BCH または (MSComm.CommPort = 1 'RS-232Cポート番号 MSComm.PortOpen = True MSComm.Settings = "9600,n,8,1" MSComm.RThreshold = 1 MSComm.SThreshold = 1 MSComm.RTSEnable = False MSComm.InputMode = MSCommLib.InputModeConstants.comInputModeBinary) End Sub この後、クリックイベント ret = Me.NspCom.ComOpen(Comport, OP) If ret = -1 Then MsgBox("miss") End If または (MSComm.PortOpen = true) でオープンさせたいのですが… 機器のHPにもサンプルプログラムもなく困っています。助言&ご指摘お願いします。

  • RS-232cによるオシロスコープのデータ転送

    日立電子製のオシロスコープの波形データを、パソコンに取り込みたいのですが、うまくいきません。 RS-232cでオシロとパソコン(WinXP)を繋いで、次のような取説の作成例を参考にプログラムを組んで、 これをbasicで実行してみたんですが、何も実行されず。。。 素人で申し訳ありませんが、何かお分かりの方がいらっしゃったら、教えてください! 10 '***Ri(mmmm,nnnn,x) COMMAND (N((BASIC) *** 20 OPEN "COM1:N81NN" AS #1 30 PRINT #1,"R1(0000,0050,B)" 40 RTN$=INPUT$(14,1) 50 FOR I=1 TO 51 60 WRK$=INPUT$(1,1) 70 RTN$=RTN$+MID$(STR$(ASC(WRK$)),2)+"," 80 NEXT I 90 PRINT "Ri RETURN=";RTN$ 100 CLOSE #1 110 END

  • MELSEC-QシーケンサをVBAで通信したい!

    三菱のシーケンサMELSEC-Qシリーズのシーケンサ「QJ71C24N」にエクセルVBAで 通信したいと考えています。なかなかうまくいかず、困り果てています・・・。 下記、進めてきた経緯と組んだプログラムを書きます。 どこがおかしいか、どなたか教えてください・・・ ■ゴール シーケンサ内部のM300という変数に格納されている値を、VBAで作成した テキストボックスに表示させたい。 1.使用するエクセルのバージョンは2003です。 MSCOMMが入ってなかったため、「vb6sp6rt4.exe」というランタイムを用いて MSCOMMはインストールできました。 2.以下プログラム Dim R As String Private Sub CommandButton1_Click() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True MSComm1.inbuffercount = 0 ' 0文字受信するまで待機 MSComm1.output = Chr$(H5) + "F90000FF0004010000D*0010200050" + Chr$(H31) + Chr$(H43) End Sub +でいいのでしょうか?&というのも見ましたが・・・。 一応下記の通りだと取扱説明書をみながら、進めました。 'chr$(H5):制御コードENQuiry(問合せ):ヘッダ 'F900:識別番号+フレーム+局番号 '00FF:ネットワーク番号+PC番号 '00:自局番号 '0401:コマンド(一括読み出し) '0000:サブコマンド(モニタ条件指定無し、デバイスメモリ拡張指定無し) 'D*:デバイスコード '001020:先頭デバイス '50:デバイス点数 ' Chr$(H31) + Chr$(H43):サムチェックコード ↓ここからが、テキストボックスへの表示になりますが・・・。これもうまくいかず。 Private Sub CommandButton2_Click() R = MSComm1.input text1.Text = R text2.Text = Mid$(R, 6, 4) End Sub そして、ポートオープン。これは、エラーが出ず、うまくいったと考えています。 Private Sub Form_Load() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True End Sub そして、ポートクローズ。こちらも、エラーが出ず、うまくいったと考えています。 Private Sub CommandButton3_Click() MSComm1.portopen = False End Sub 最大の問題は、しっかりとコードが送信できているのかというところです。 解らないところも多々あるため不明な点も多いですが、なにとぞ、教えてください。

  • RS232CでのRFIDリーダライタの制御プログラム。

    研究用にタカヤ製品http://www.takaya.co.jp/enterprise/rf/rfid/module.htm のRFID評価キットTR3-D002Aを購入しました。 ↓のようなVB6.0で16進数のバイト列を送信してレスポンスをえるプログラムを作りました。 MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.Handshaking = comNone MSComm1.PortOpen = True Dim Send(7) As Byte Send(0) = &H2 Send(1) = &H0 Send(2) = &H4F Send(3) = &H1 Send(4) = &H0 Send(5) = &H3 Send(6) = &H55 Send(7) = &HD MSComm1.Output = Send 通信プロトコルはあっていると思うし、COMモニタでみても、ついてきたデモソフトと同じ信号が出力されているので、 リーダライタからレスポンスのデータが帰ってくると思うのですが、COMモニタでみる限り何もレスポンスはないです。 プログラミングは初めてなのもあり、困っています。 何か特殊なことをしないと、こういうSDKが別売であるような機器を制御するのは無理なのでしょうか? また、原因は何が考えられるでしょうか?

専門家に質問してみよう