投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/10/3 17:06:59
DataReceived イベント内から メッセージボックスを呼び出してはいけません。

MessageBox を表示した段階でコードの実行がそこで止まってしまいますので、
処理の確認を行いたいのであれば、Debug.WriteLine メソッド等を使うようにしましょう。
(同様の理由で、ブレークポイント等による一時停止も避けるようにします)

> Private Sub SerialPort1_DataReceived(…
>  Dim dtBegin As Date = DateTime.Now
>  Dim dtCurrent As Date = DateTime.Now   'データを受信した時刻
>  Dim span As TimeSpan = dtCurrent - dtBegin  '経過時間
>  Dim totalSeconds As Double = span.TotalSeconds '何秒経過したのか


dtBegin の部分が明らかにおかしいです。上記は要するに、
 Dim span As TimeSpan = Now - Now
 Dim totalSeconds As Double = span.TotalSeconds
とほぼ同義ですよね。これでは totalSeconds ≒ 0.0 になるのも当然です。

私が先に書いたのは
  Dim dtBegin As Date = [SerialPortをOpenした時の時刻]
であって、
  Dim dtBegin As Date = [DataReceived イベントが呼ばれたときの時刻]
ではありませんよ。

dtBegin は、「SerialPortをOpenした時の時刻」もしくは
「DataReceived イベントが最初の 1 回目に呼ばれたときの時刻」にしましょう。


> 通信開始時刻と現時刻をミリ秒単位で取得して
実際の分解能はさておき、Now で得られる日付値は
100ナノ秒単位まで取得できるようになっていますので、
  Dim totalSeconds As Double = span.TotalSeconds
の部分を
  Dim totalMilliseconds As Double = span.TotalMilliseconds
としておけば十分かと思います。