LEDN41-LAN サンプルプログラム

            

ホーム > 表示機・ディスプレイ > 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 : 2017/05/17

 

LEDディスプレイ、LED表示機、カウントアップ、カウントダウン