VB.NETでシリアル通信ソフトを制作する最初の関門は、送受信がスムースにできるコードを確定することです。まずツールボックスから SirialPort を Form にドラッグし、そのプロパティに所定のCOMチャンネル、ボーレート、ストップビットを設定します。次に送信のコードは以下のようになります。
----------------------------------
'シリアルポートをオープンしていない場合、処理を行わない.
If SerialPort1.IsOpen = False Then
Return
End If
'送信するテキストは data 、ここでは VFO-A の周波数を読みに行く
Dim data As String
data = "FA;"
'送信するテキストがない場合、データ送信は行わない.
If String.IsNullOrEmpty(data) Then
Return
End If
Try 'シリアルポートからテキストを送信
SerialPort1.WriteLine(data)
End Try
これに対してもしポートにデータが入力された場合、これを読んで受信テキストを得ます。このコードはかなり厄介でベタコピがオススメ。
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)Handles SerialPort1.DataReceived
'シリアルポートをオープンしていない場合、処理を行わない.
If SerialPort1.IsOpen = False Then
Return
End If
Try
'受信データを読み込む.
Dim data As String
data = SerialPort1.ReadExisting()
'受信したデータをテキストボックスに書き込む.
Dim args(0) As Object
args(0) = data
Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args)
End Try
End Sub
-------------------------------------
Private Sub RcvDataToTextBox(ByVal data As String)
RcvTextBox.AppendText(data)
If CommandStrings = "FA;" Then TextBox1.Text = data
End sub
-------------------------------------------
以上のコードで FA; を送信し無事 TextBox1 に周波数を受信することができました。次に周波数を連続して受信するコードを試してみました。
-------------------------------------------
Fstart: '周波数の連続受信
TextBox1.Clear()
RcvTextBox.Clear()
CommandStrings = "FA;"
SerialPort1.WriteLine(CommandStrings)
GoTo Fstart
-------------------------------------------
ところがこれが全然動きません。つまり単発の送信はできても連続すると動かない、ということです。そこで試行錯誤を行った結果次のような対策で可能になりました。
・FTdx10のタイムアウトタイマーをデフォルトの10msecに戻す。
・次の位置に遅延時間要素を挿入する。
--------------------------------------
Fstart:
TextBox1.Clear()
RcvTextBox.Clear()
CommandStrings = "FA;"
SerialPort1.WriteLine(CommandStrings)
' FUNCTION でループによる遅延時間要素を作成する、*はそのループ数(遅延時間)設定値
DummyLoop(*)
GoTo Fstart
----------------------------------------------
これで周波数の連続受信が可能になりましたが、この遅延時間の値が動かすPCの性能により変える必要があることが分かりました。例えばPCの動作速度が速い場合、この遅延時間を大きくする必要があります。しかしあまり大きくすると動作しなくなり、その幅はやってみなければ分からない、という状況です。