質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Q&A

解決済

1回答

1630閲覧

VB.NETにおけるRS-232Cバイナリ通信受信でNULが消える現象

Ryuji_0322

総合スコア1

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

0グッド

1クリップ

投稿2020/08/19 09:53

前提・実現したいこと

VisualBasic.NET(2008)でRS-232Cのバイナリ通信をしています。
プロトコルはMODBUS RTUモード通信です。ある程度動作はしているのですが、よくわからない現象が発生して
しまったので、質問させてください。

発生している問題・エラーメッセージ

相手機器から送られたデータ内に0(NUL)があった場合、0データのみ除去した状態の受信バッファなって
しまいます。
例をあげると相手機器にバイナリで
<01>, <04>, <00>, <02>, <00>, <01>, <90>, <0A> を送信すると
相手機器は、<01>, <04>, <02>, <00>, <00>, <B9>, <30>を送信しています。
(この受信の内容はシンクロで確認済み 下記に画像があります)
しかしプログラム上で受信データを確認すると
<01>, <04>, <02>, <B9>, <30>となっていて、0データが2バイトなくなっています。
いろいろなケースで試しましたが、0データだけが消えているのは間違いないようです。

シンクロで取った画像を添付します。
イメージ説明

バイナリ通信の場合、何か0データに関する設定とかがあるのでしょうか?
ご教示頂ければと思います。

下記ソースコードは実際に動かしているプログラムの、関係していると思われる箇所の抜粋です。

該当のソースコード

VisualBasic.NET(2008)

1 2 Dim RcvCnt; 3 Dim bRcvBft(2000); 4 5 '================================================================================ 6 '== == 7 '== 通信イベントプロシージャ == 8 '== == 9 '================================================================================ 10 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 11 12 Dim Cnt As Integer 13 Dim i As Integer 14 15 '---- バイナリーモード 16 Cnt = SerialPort1.BytesToRead 17 For i = RcvCnt To RcvCnt + Cnt - 1 18 bRcvBft(i) = SerialPort1.ReadByte 19 Next 20 RcvCnt = i 21 22 End Sub 23 24 '================================================================================ 25 '== == 26 '== 通信インターバル処理 (1ms) == 27 '== == 28 '================================================================================ 29 Private Sub tmrComm_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrComm.Tick 30 31 Dim Pos As Integer 32 Dim RcvDt As String 33 34 '---- バイナリーモード 35 If RcvCnt = 0 Then TimerCount(9) = 2 36 If TimerCount(9) > 0 Then Exit Sub 37 38 ' 2msの間データ受信がない 39 40 bRcvBuf = bRcvBft 41 RcvCount = RcvCnt 42 RcvCnt = 0 43 44 Call NetLogBin("Rcv: ", bRcvBuf, RcvCount) '--- 通信ログ処理 45 46 RcvDt = Bin2Hex(bRcvBuf, RcvCount) '---バイナリをHEXデータに変換 47 Call DataSet(1, RcvDt) '--- データ表示 48 49 ChkRcvDt = RcvBuf 50 51 End Sub 52 53

試したこと

下記URLのフリーソフトでも試してみましたが、私の結果と同じでした。

http://nonsoft.la.coocan.jp/Download/Rs232cTool/index.html

結果の画像はこちらです。
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/08/19 11:15

受信したバイト数はNULを含んだバイト数なのですか? また、プログラム側での確認はどのようにされているのですか?
Ryuji_0322

2020/08/19 13:29

受信バイト数はNULを含んでいないバイト数です。 プログラムでの確認はBytesToReadの内容です。
guest

回答1

0

ベストアンサー

SerialPort.DiscardNullプロパティはどうなっていますか?
規定値はfalseなので、触っていないならNULLは受信するはずです。

投稿2020/08/19 11:25

YAmaGNZ

総合スコア10251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryuji_0322

2020/08/19 13:34

DiscardNullはTrueにしていました。 以前に製作したプログラムを流用したので、どんな経緯でTrueにしたのか覚えていませんが、これをFalseにすれば解決しそうです。 明日確認してご報告致します。ありがとうございました。
Ryuji_0322

2020/08/20 00:13

ご指摘の通り、DiscardNullをFalseに設定したところ、正常に動作しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問