LEDN41-LAN サンプルプログラム
|
|
|
Microsoft Visual Studio 2010 Visual Basic で作成されたLAN接続でソケット通信を行うための、サンプルソースファイルを用意しております。
プログラムを作成する際の参考にしてください。
※内容は予告なく変更される場合がございます |
|
サンプルプログラム
■ 接続IP、Port
接続するLEDN41-LANのIPアドレスとポートを入力します。この例では、192.168.1.199と10001を記入しています。ご使用の環境に合わせて設定してください。
|
|
|
■ 表示
LEDN41-LANに表示する数値、-、半角スペースを入力し、表示ボタンをクリックするとLEDN41-LANに入力した値が表示されます。
|
|
■ 送信/受信
「送信コマンド」のテキストボックスにコマンドを手入力し、送信ボタンをクリックすることで各種設定が行えます。また、受信データがある場合には「受信ステータス」のテキストボックスにステータスが返ってきます。
|
|
|
|
■ サンプルソース
|
Imports System.Net
Imports System.Net.Sockets
Imports System.Text.Encoding
Imports System.Text
Imports System.Threading
Public Class FrmMain
' LEDN41からの文字列を格納する変数
Dim ReceiveCommand As String = ""
Private Sub SendDispBtn_Click(sender As System.Object, e As System.EventArgs) Handles SendDispBtn.Click
' テキストボックスに入力した数値と表示コマンドを送信、その後受信
ReceiveCommand = SendCmd("D" + TextBox1.Text, True)
err_msg() 'エラーメッセージ処理
End Sub
Private Sub TakeBtn_Click(sender As System.Object, e As System.EventArgs) Handles TakeBtn.Click
Dim i As Integer = 0
Dim n As Integer = 0
Dim last_dsp() As String
Dim txt As String = ""
' メインフレームをディスエーブル
frmMainEnableDisable(False)
' 表示している値を取得するLDコマンドを送信、その後受信
ReceiveCommand = SendCmd("LD", True)
' メインフレームをイネーブル
frmMainEnableDisable(True)
'LDコマンドが成功すると、LDnnnn&で文字列が返ってくるので、&とLDを削除してテキストボックスに表示させる
'受け取った文字列を配列に&を探し、格納、格納した配列から&を削除する
last_dsp = ReceiveCommand.Split("&"c)
'受け取った文字列にエラーがないか探す
For Each Str As String In last_dsp
If Str.Contains("LD") Then
txt = Str
ElseIf Str.Contains("^") Then
MsgBox("オーバーフローエラー")
Exit Sub
ElseIf Str.Contains("?") Then
MsgBox("パラメータエラー")
Exit Sub
End If
Next
'文字列からLDを消し、テキストボックスに表示
LastDispValue.Text = txt.Replace("LD", "")
End Sub
Private Sub btnSend_Click(sender As System.Object, e As System.EventArgs) Handles btnSend.Click
' メインフレームをディスエーブル
frmMainEnableDisable(False)
' ソケットを送信、その後受信
TxtBxReceive.Text = SendCmd(TxtBxSendCom.Text, True)
' メインフレームをイネーブル
frmMainEnableDisable(True)
End Sub
Public Function SendCmd(ByVal Cmd As String, ByVal reqStatus As Boolean) As String
' 文字型変数を用いると、処理系から外へデータを送り出す際に、漢字コードのエンコード/デコードが自動で行われてしまう。
' データ型(バイト配列)として処理することで、処理系のエンコードの影響を受けずにデータを受け渡す。
'
' Cmd(テキストボックスのText内容)をデータ引渡用のバイト配列に入れ、Shift-JISエンコードする。
' この関数の戻り値を予め空にする
SendCmd = String.Empty
Try
' Cmdの文字列データをSHIFT-JISでエンコードし、バイト配列に変換する。
Dim SendData As Byte() = GetEncoding("SHIFT-JIS").GetBytes(Cmd)
' ネットワーク送信先のIPアドレス(例192.168.1.199)とPort番号(例10001)を指定して、データをソケット送信する。
' 本例では、IPEndPointクラスを用いてIPアドレスとポート番号を引き渡す。
Dim MsssAddress As New IPAddress(0) ' アドレスの書式チェックした際の受取変数(0はダミー)
Dim MsssPort As Integer = CInt(nudSetPort.Value) ' ポート番号を整数化する
If IPAddress.TryParse(txtSetIP.Text, MsssAddress) Then ' IPアドレス文字列(txtSetIP.Text)が成立する場合、MsspAddressに代入する
' IPアドレスとポート番号をインスタンス化
Dim dstEP As IPEndPoint = New IPEndPoint(MsssAddress, MsssPort)
' SendTcpClientを使用しTCP/IP通信を行う。戻り値は受信データ。
Dim bufByte As Byte() = SendTcpClient(dstEP, SendData, reqStatus)
' 受信データが空でなければ、関数の戻り値として代入する
If (Not IsNothing(bufByte)) AndAlso (bufByte.Length > 0) Then
SendCmd = GetEncoding("SHIFT-JIS").GetString(bufByte)
End If
End If
Catch ex As ArgumentException
MsgBox("文字列エンコード失敗")
Catch ex As Exception
End Try
End Function
'
' TCP/IP通信 (ネット送信先,送信データ[Byte配列パラメータ渡し]、戻り値が受信データ)
'
' ソケット通信(クライアント側)を実装する
'
' 本例は.Net Framework用ですが、他の環境では基本的なソケット通信の考え方の参考としてください。
' iOS(Objective-C)では、[Objective-C],[socket.io][クライアント][エンコード]などのキーワードで検索してください。
'
Private Function SendTcpClient(ByVal SendIP As IPEndPoint, ByVal byteSend As Byte(), ByVal reqStatus As Boolean) As Byte()
SendTcpClient = Nothing '戻り値の初期値(エラー)
' 送信データが空でなければ、通信処理を行う。
If byteSend.Length > 0 Then
Try
'
' ソケット(クライアント)接続を行う
'
' .Netframeworkでは TcpClientクラス(本例)もしくはSocketクラスによりソケット接続が行える。
'
Using NetClient As New TcpClient ' TCPクライアントオブジェクトをインスタント化
' 接続開始
' SendIPとしてIPとPortを渡し、クライアント接続を行う。
NetClient.Connect(SendIP)
' タイムアウト設定 本例では500mSec (0.5秒)
NetClient.ReceiveTimeout = 500
NetClient.SendTimeout = 500
' Streamに送信データを出力する
Using stream As NetworkStream = NetClient.GetStream()
' NetworkStreamに書き込み可能かチェック
If stream.CanWrite Then
' 送信用データを送信する
stream.Write(byteSend, 0, byteSend.Length)
' 受信処理を行うかをチェック
If reqStatus AndAlso stream.CanRead Then
' バッファを準備し読み込む
Dim TimeOut As Date = Now.AddMilliseconds(500) ' 受信タイムアウト(0.5秒)
Dim Found As Boolean = False
Dim Results As New List(Of Byte)
Do
Threading.Thread.Sleep(100)
If stream.DataAvailable Then
' bufByte(受信)バッファのサイズ設定
Dim bufByte(NetClient.ReceiveBufferSize) As Byte
' bufByte(受信)バッファに読み取られた合計バイト数
Dim LenRes As Integer = stream.Read(bufByte, 0, bufByte.Length)
' bufByte2(コピー)バッファのサイズを、受信したデータサイズに設定
Dim bufByte2(LenRes - 1) As Byte
If LenRes > 0 Then
' bufByte(受信)バッファからbufByte2(コピー)バッファへデータをコピー
Buffer.BlockCopy(bufByte, 0, bufByte2, 0, LenRes)
' Resultアレイリストへ追加
Results.AddRange(bufByte2)
' 以下のプログラムで、コマンドの終端を探す
Dim i As Integer
For i = 0 To NetClient.ReceiveBufferSize - 1
If bufByte(i) = &H3F Or bufByte(i) = &H5E Then
Found = True ' 終端見つかる
Exit For
End If
Next
TimeOut = Now.AddMilliseconds(500) ' タイムアウト延長
End If
End If
'終端に達するかタイムアウトまでループする
Loop Until Found OrElse (Now > TimeOut)
' 受信データを戻り値として返す
SendTcpClient = Results.ToArray
End If
End If
stream.Close()
End Using
NetClient.Close() ' ソケット接続をクローズする
End Using ' Using外によりソケットオブジェクトを明示的に開放(Dispose)する
Catch ex As ArgumentNullException
MsgBox("通信エラー" & vbCrLf & "[NullException]" & vbCrLf & ex.Message, MsgBoxStyle.Exclamation)
Catch ex As SocketException
MsgBox("通信エラー" & vbCrLf & "[SocketException]" & vbCrLf & ex.Message, MsgBoxStyle.Exclamation)
Catch ex As Exception
MsgBox("通信エラー" & vbCrLf & ex.Message, MsgBoxStyle.Exclamation)
End Try
End If
End Function
Private Sub err_msg()
Dim msg(1) As String
For i = 1 To ReceiveCommand.Length
If Mid(ReceiveCommand, i, 1) = "^" Then
msg(0) = "オーバーフローエラー" + vbCrLf
ElseIf Mid(ReceiveCommand, i, 1) = "?" Then
msg(1) = "パラメータエラー" + vbCrLf
End If
Next
If msg(0) <> "" Or msg(1) <> "" Then
MsgBox(msg(0) + msg(1))
End If
End Sub
' 主に受信処理時にボタンなどをクリックできないようにディスエーブルする
Private Sub frmMainEnableDisable(ByVal flag As Boolean)
If flag Then
Me.Enabled = True
Else
Me.Enabled = False
End If
End Sub
' プログラムの終了
Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
End
End Sub
End Class
|
|
対応OS :
Windows7 32bit版、64bit版、Windows8 32bit版、64bit版
Windows8.1 32bit版、64bit版、Windows10 32bit版、64bit版
製品LEDN41-LANご紹介のページはこちらです。
|
|
Last Update :
2023/03/07
LEDディスプレイ、LED表示機、カウントアップ、カウントダウン
|