C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[16]: RS232Cでデータ送信(VB2005)


(過去ログ 92 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■54686 / inTopicNo.1)  RS232Cでデータ送信(VB2005)
  
□投稿者/ せき (1回)-(2010/10/29(Fri) 10:13:09)

分類:[VB.NET/VB2005 以降] 

RS232Cで送受信するプログラムをVB2005で作成しております。
[ACK],[NCK]の送受信はできておりますが、データを送信する箇所をどうしたらいいかわかりません。
データは以下のような形式です。
[@STX]+[AJIS8データ(30byte)]+[BShift-JISデータ(50byte)]+[CETX]+[DLRC]

SerialPort1.Writeで送信することになると思いますが、編集方法と送信方法のわかる方ご教示下さい。
よろしくお願い致します。
引用返信 編集キー/
■54687 / inTopicNo.2)  Re[1]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (131回)-(2010/10/29(Fri) 10:31:19)
No54686 (せき さん) に返信
writeメソッドはbyte配列を渡す方を使用して下さい。
文字列は対象となるエンコーダでbyte配列にして下さい。
(Encodingクラスを使用)
引用返信 編集キー/
■54701 / inTopicNo.3)  Re[2]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (2回)-(2010/10/29(Fri) 14:30:46)
No54687 (shu さん) に返信
shu さん、ご返信ありがとうございます。
その後、以下のところまではコード作成しました。
Dim sSNDDATA As String = "abcde"
Dim buf As Byte() = Encoding.GetEncoding("Shift_JIS").GetBytes(sSNDDATA)
Dim size As Short = buf.Length
Me.SerialPort1.Write(buf, 0, size)

しかし、[@STX]、[CETX]、[DLRC]はどのように付加したらいいかわからないのですが、ご存知でしたら、ご教示下さい。
引用返信 編集キー/
■54703 / inTopicNo.4)  Re[3]: RS232Cでデータ送信(VB2005)
□投稿者/ 774RR (560回)-(2010/10/29(Fri) 14:40:46)
STX ETX は ASCII で言う制御文字、値 2 と 3 だ
http://ja.wikipedia.org/wiki/ASCII

LRC っつのは知らないなー。多分 Line R*** Code ということでいわゆるチェックコードだろう。
電文データを一定法則で計算した結果、と思われる(根拠なし)
チェックサムだったら和(桁あふれ無視)だし、 CRC なら CRC 演算結果。
電文の仕様書に書いてあるはず。
引用返信 編集キー/
■54704 / inTopicNo.5)  Re[3]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (136回)-(2010/10/29(Fri) 14:45:26)
No54701 (せき さん) に返信
> しかし、[@STX]、[CETX]、[DLRC]はどのように付加したらいいかわからないのですが、ご存知でしたら、ご教示

アスキーコード表です
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

STX => &H02
ETX => &H03


LRC => A,BのByteデータ値をすべて足して下位8ビットを取得、256から引く(2の補数)
でいいと思います。
http://www.toho-inc.com/products/manual/communications/trm-006a.pdf
引用返信 編集キー/
■54707 / inTopicNo.6)  Re[4]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (3回)-(2010/10/29(Fri) 15:41:10)
774RR さん、shu さん、ご返信ありがとうございます。

ただ、RS232C通信プログラムを始めて作成する私には、基本的なことがわからず、以下のような書き方しか思いつけませんでした。
Dim sSNDDATA As String
sSNDDATA = "&H02" & "abcde" & "&H02"

具体的にどのように、[@STX]、[CETX]、[DLRC]を付加したらいいでしょうか?


引用返信 編集キー/
■54713 / inTopicNo.7)  Re[5]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (137回)-(2010/10/29(Fri) 17:35:08)
No54707 (せき さん) に返信
> 774RR さん、shu さん、ご返信ありがとうございます。
>
> ただ、RS232C通信プログラムを始めて作成する私には、基本的なことがわからず、以下のような書き方しか思いつけませんでした。
> Dim sSNDDATA As String
> sSNDDATA = "&H02" & "abcde" & "&H02"
>
> 具体的にどのように、[@STX]、[CETX]、[DLRC]を付加したらいいでしょうか?
>
>
(1)送信するデータは83byteなので83byteの配列を作ります。
(2)配列の0番目に2
(3)配列の1番目〜30番目にAの内容のbyteデータ
(4)配列の31番目〜80番目にBの内容のbyteデータ
(5)配列の81番目に3
(6)配列の82番目に1番目から80番目の値を足して256で割った余りを256から引いた値を設定
(7)write(配列)
です。

引用返信 編集キー/
■54716 / inTopicNo.8)  Re[6]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (4回)-(2010/10/29(Fri) 19:17:54)
No54713 (shu さん) に返信
> (1)送信するデータは83byteなので83byteの配列を作ります。
> (6)配列の82番目に1番目から80番目の値を足して256で割った余りを256から引いた値を設定
>

shu さん、ご返信ありがとうございます。

たびたびで申し訳ありませんが、また、質問させてください。

配列のデータ型はStringでしょうか?

(6)を算出する計算式または関数が全く想像できません。
例えば、AJIS8データ(5byte):アイウエオ、BShift-JISデータ(10byte):あいうえお
Dim sDATA2 As String = "アイウエオ"
Dim sDATA3 As String = "あいうえお"
とすると、コードはどうなるでしょうか?コード例をご教示いただけないでしょうか?
引用返信 編集キー/
■54717 / inTopicNo.9)  Re[7]: RS232Cでデータ送信(VB2005)
□投稿者/ 魔界の仮面弁士 (1902回)-(2010/10/29(Fri) 19:42:43)
2010/10/29(Fri) 19:44:44 編集(投稿者)

No54716 (せき さん) に返信
>>83byteの配列を作ります。
> 配列のデータ型はStringでしょうか?
手順 7 の記載を見ると、たしかに String と誤解しそうですが、
ここでは Byte 型の配列にしておいた方が良いでしょう。

Dim buf(82) As Byte


>>(6)配列の82番目に1番目から80番目の値を足して256で割った余りを256から引いた値を設定
> (6)を算出する計算式または関数が全く想像できません。

'1番目から80番目の値を足して
Dim sum As Integer = 0
For i As Integer = 1 To 80
 sum += buf(i)
Next

'256で割った余りを
Dim a As Integer = sum Mod 256

'256から引いた値
Dim b As Integer = 256 - a

'を配列の82番目に設定
buf(82) = b ' buf(82) = 256 - (sum Mod 256)
引用返信 編集キー/
■54721 / inTopicNo.10)  Re[7]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (138回)-(2010/10/30(Sat) 02:05:05)
No54716 (せき さん) に返信
> 
> たびたびで申し訳ありませんが、また、質問させてください。
> 
> 配列のデータ型はStringでしょうか?
最初のレスでbyte配列を使うように言ったつもりだったのですが伝わらなかったですね。


> (6)を算出する計算式または関数が全く想像できません。
> 例えば、AJIS8データ(5byte):アイウエオ、BShift-JISデータ(10byte):あいうえお
> Dim sDATA2 As String = "アイウエオ"
> Dim sDATA3 As String = "あいうえお"
> とすると、コードはどうなるでしょうか?コード例をご教示いただけないでしょうか?
あまり完全に近いコードの提示はしたくないのですが話を伸ばしてもしょうがないので提示された
値に対し処理する例を載せます。(魔界の仮面弁士さん、コードを少し頂きましたmm)
LRCの計算で合計を256で割った余りが0のとき256になってしまうのでmod256を追加してます。
また計算は正しいのかわかりませんので仕様確認をして下さい。

        Dim sDATA2 As String = "アイウエオ"
        Dim sDATA3 As String = "あいうえお"
        Dim bytBuf(82) As Byte
        Dim intIdx As Integer

        '--- 念のため0クリア
        Array.Clear(bytBuf, 0, bytBuf.Length)
        '--- STX
        bytBuf(0) = 2
        '--- Data2   JIS8用のエンコードの取得が分からなかったので1文字ずつASCコードを取得しています。
        intIdx = 1
        For Each chrTmp As Char In sDATA2
            If intIdx <= 30 Then
                Dim bytCD As Integer = Asc(chrTmp)
                bytBuf(intIdx) = bytCD
            End If
            intIdx += 1
        Next
        '--- Data3
        intIdx = 1
        Dim encSJis As Encoding = Encoding.GetEncoding("Shift-Jis")
        encSJis.GetBytes(sDATA3, 0, sDATA3.Count, bytBuf, 31)
        '--- ETX
        bytBuf(81) = 3
        '--- LRC
        Dim intSum As Integer = 0
        For intIdx = 1 To 80
            intSum += bytBuf(intIdx)
        Next
        Dim a As Integer = intSum Mod 256
        Dim b As Integer = (256 - a) Mod 256    '--- 下位8ビットを取得するためこっちも256で割った余りとする

        bytBuf(82) = b

引用返信 編集キー/
■54730 / inTopicNo.11)  Re[8]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (5回)-(2010/10/31(Sun) 04:23:19)
魔界の仮面弁士さん、shu さん、コードをご提示いただきありがとうございます。

ただ、実際にこのコードでプログラム作成しようとしたところ、sDATA3.Countが
エラーとなってしまいました。ためしに、sDATA3.Lengthに置き換えて、編集後、
Me.SerialPort1.Write(bytBuf, 0, bytBuf.Length)
で送信したところ、以下のようになってしまいました。

HEXモード:02 B1 B2 B3 B4 B5

sDATA3.Countがエラーにならずに、正しく送信するにはどうしたらいいでしょうか?
引用返信 編集キー/
■54735 / inTopicNo.12)  Re[9]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (139回)-(2010/10/31(Sun) 21:08:15)
No54730 (せき さん) に返信
> 魔界の仮面弁士さん、shu さん、コードをご提示いただきありがとうございます。
>
> ただ、実際にこのコードでプログラム作成しようとしたところ、sDATA3.Countが
> エラーとなってしまいました。ためしに、sDATA3.Lengthに置き換えて、編集後、
2008のコードで記述していました。Lengthで大丈夫です。


> Me.SerialPort1.Write(bytBuf, 0, bytBuf.Length)
> で送信したところ、以下のようになってしまいました。
>
> HEXモード:02 B1 B2 B3 B4 B5
これは何の出力ですか?問題があるの?


引用返信 編集キー/
■54745 / inTopicNo.13)  Re[10]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (6回)-(2010/11/01(Mon) 10:05:37)
No54735 (shu さん) に返信

HEXモード:02 B1 B2 B3 B4 B5は、フリーソフト(Serister Version 1.2.5)にデータ送信した結果です。
データは、"アイウエオ"しか送信されず、"あいうえお"は送信されませんでした。

また、LRCは、
「伝送テキストブロックのETXの後ろに1Byte水平パリティチェック桁(LRC)が付加される。演算範囲はSTXの次の文字からETXまでで、水平方向の1ビット数が偶数となるように値が設定される。」
という内容でしたが、意味がかわらず、どうすれば正しい値を求められるかわかりませんでした。
LRCの内容から、shuさんのコードが正しいかどうか判断できますでしょうか?
引用返信 編集キー/
■54754 / inTopicNo.14)  Re[11]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (141回)-(2010/11/01(Mon) 11:33:56)
2010/11/01(Mon) 13:35:08 編集(投稿者)

No54745 (せき さん) に返信
> ■No54735 (shu さん) に返信
>
> HEXモード:02 B1 B2 B3 B4 B5は、フリーソフト(Serister Version 1.2.5)にデータ送信した結果です。
> データは、"アイウエオ"しか送信されず、"あいうえお"は送信されませんでした。
Vectorのページ見てみましたが、Seristerのコメントタブのとこに0x00以降のデータを認識しないとあります。
他のツールを使ってみて下さい。Byteデータ自体は正常ですか?


> また、LRCは、
> 「伝送テキストブロックのETXの後ろに1Byte水平パリティチェック桁(LRC)が付加される。演算範囲はSTXの次の文字からETXまでで、水平方向の1ビット数が偶数となるように値が設定される。」
> という内容でしたが、意味がかわらず、どうすれば正しい値を求められるかわかりませんでした。
> LRCの内容から、shuさんのコードが正しいかどうか判断できますでしょうか?
同じ結果になるか分からないですが、この内容からだとxor演算をして最後にNotを行った方がいい気もします。
計算するデータ範囲は大丈夫そうですね。

引用返信 編集キー/
■54783 / inTopicNo.15)  Re[12]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (7回)-(2010/11/02(Tue) 07:23:27)
No54754 (shu さん) に返信

RS232Cというフリーソフトを使ったところ、確かに83byte送信されていることが確認できました。ツールによってこんな違いが出るとは思いませんでした。よく確認せずに申し訳ありませんでした。

その後、実際にRS232C機器にデータ送信したところ、[NCK]が返って来てしまいます。原因がデータ部にあるのか、LRCなのかははっきりしないのですが、LRCの計算は複雑のため、原因はLRCのような気がしております。
「xor演算をして最後にNotを行う」ためのコード例をご教示いただけないでしょうか?

引用返信 編集キー/
■54784 / inTopicNo.16)  Re[13]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (144回)-(2010/11/02(Tue) 08:25:18)
No54783 (せき さん) に返信
> ■No54754 (shu さん) に返信
> 
> RS232Cというフリーソフトを使ったところ、確かに83byte送信されていることが確認できました。ツールによってこんな違いが出るとは思いませんでした。よく確認せずに申し訳ありませんでした。
> 
> その後、実際にRS232C機器にデータ送信したところ、[NCK]が返って来てしまいます。原因がデータ部にあるのか、LRCなのかははっきりしないのですが、LRCの計算は複雑のため、原因はLRCのような気がしております。
> 「xor演算をして最後にNotを行う」ためのコード例をご教示いただけないでしょうか?
> 

        Dim bytLRC As Byte = 0

        For intIdx = 1 To 80
            bytLRC = bytLRC  xor bytBuf(intIdx)
        Next
        bytLRC = not bytLRC

        bytBuf(82) = bytLRC 

引用返信 編集キー/
■54788 / inTopicNo.17)  Re[14]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (145回)-(2010/11/02(Tue) 12:14:52)
No54784 (shu さん) に返信

Not処理はいらなそうです。
引用返信 編集キー/
■54790 / inTopicNo.18)  Re[15]: RS232Cでデータ送信(VB2005)
□投稿者/ せき (8回)-(2010/11/02(Tue) 12:48:45)
No54788 (shu さん) に返信

shuさん、いろいろと細かいコードまで教えてありがとうございます。
おかげさまで解決できました。
本当にありがとうございました。


解決済み
引用返信 編集キー/
■54794 / inTopicNo.19)  Re[16]: RS232Cでデータ送信(VB2005)
□投稿者/ shu (146回)-(2010/11/02(Tue) 13:37:54)
No54790 (せき さん) に返信

どぼんさんの掲示板へも投稿した方なら、ここを見なくても分かるように解決方法をあちらへも
記載することを奨めます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -