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

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

新規登録して質問してみよう
ただいま回答率
85.47%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

2回答

1249閲覧

【VB】シリアル受信した文字列の分割・数値化処理

momo842

総合スコア7

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

0クリップ

投稿2020/07/31 01:29

編集2020/07/31 06:25

前提・実現したいこと

シリアル受信した計測結果を数値として格納して、その後処理を行うような
プログラムを作成中です。しかし序盤も序盤の計測結果の数値化処理でつまずいています。

シリアル通信で指令をだすと、返り値として計測結果が以下のようにでてきます。

例)[100ms]:0000 0001000000020000
␣␣␣①␣␣␣␣②␣␣␣␣␣␣③

①:処理時間
②:正常終了メッセージ
③:計測値

例の場合、③の文字列を
00010000 と 00020000 に分け、これらを10進変換し
65536 と 131072 として演算に使いたいと思っています。

シリアル受信してデータは捕まえても、
①②の部分を省き、且つ文字列から数値を取り出すという部分が全く思いつかず
今に至る次第です。

知りたいことは2点です。
1、例のような返り値に対して、演算処理したい部分(③)を取り出す方法
2、取り出した文字列を2分割し 10000 と 20000 という部分まで処理をする方法

VB初心者の質問で申し訳ありません。
ご回答の程宜しくお願い致します。

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

後だし情報申し訳ないです。
データの取得方法は厳密には、
駆動cmd1→計測cmd1→駆動cmd2→計測cmd2・・・→シリアル読み出し→処理
というフローになっています。
そのためシリアル上のログは下記のような感じになります。

駆動1のメッセージ
[100ms]:0000 0001000000020000 ’計測1のメッセージ
駆動2のメッセージ
[96ms]:0000 0001100000019000 ’計測2のメッセージ
:
ーーー終了ーーー

そのため現状はシーケンスの最後にシリアル読み出してログファイル作成をして、
テキストファイルの処理をする形を模索しています。
(駆動→バッファクリア→計測→読み出し と都度やれば計測結果だけのログは作れますね、、、書きながらきづきました、、、)

毎回計測結果の文字列が、処理時間によって文字数変化してしまうため、
固定文字数からの切り出しができません、、、

情報をうまく整理できず申し訳ないです。
宜しくお願いします。

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

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

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

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

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

YAmaGNZ

2020/07/31 06:47

明確にここが取り出すべき数値だというプロトコル仕様が不明なのにどうやって取り出すのでしょうか? 「:」からの文字数とか決まっていることはないのですか?
momo842

2020/07/31 09:47

なるほど。。。 :と0000の後のスペースからは決まっています。
YAmaGNZ

2020/07/31 10:14

それなら、Splitした結果を回答のようにすればどうですか?
guest

回答2

0

まずは文字列処理でそのぶんの文字列を切り出していけばいいです。
あとは、それを数値変換します

投稿2020/07/31 02:21

y_waiwai

総合スコア87784

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

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

momo842

2020/07/31 06:27

ご回答ありがとうございます。 計測結果の文字列が文字数が毎回一致しているわけではないため悩み中です、、、
y_waiwai

2020/07/31 06:39

文字数が違うなら変換しようがないですね。 なにか区切りの手がかりはあるんでしょうか
momo842

2020/07/31 09:48

:とスペースからの距離は決まっているので、それを足掛かりに求める方法を考えようと思います!
y_waiwai

2020/07/31 10:13

スペース以降の文字数が決まってれば、そんで切り出せますが。
guest

0

ベストアンサー

VB

1 Dim message = "[100ms]:0000 0001000000020000" 2 dim v1 = message.Substring(13,8) 3 dim v2 = message.Substring(21,8) 4 Console.WriteLine (v1) 5 Console.WriteLine (v2) 6 Console.WriteLine (Convert.ToInt32(v1,16)) 7 Console.WriteLine (Convert.ToInt32(v2,16))
00010000 00020000 65536 131072

VB

1 Dim message As String = "[100ms]:0000 0001000000020000" 2 3 dim v() As String = message.Split(" ") 4 dim v1 As String = v(1).Substring(0,8) 5 dim v2 As String = v(1).Substring(8,8) 6 Console.WriteLine (v1) 7 Console.WriteLine (v2) 8 Console.WriteLine (Convert.ToInt32(v1,16)) 9 Console.WriteLine (Convert.ToInt32(v2,16))

投稿2020/07/31 01:41

編集2020/07/31 06:38
ozwk

総合スコア13528

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

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

momo842

2020/07/31 06:28

ご回答ありがとうございます。 コード添付までしてくださりとても参考になります。 しかし毎回文字列が微妙に文字数違い(追記の通り)があり、うまく処理できず悩んでいます、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問