投稿者 ポムNNN  (社会人) 投稿日時 2018/3/10 15:55:48
visual studio2015 で arduinoとパソコン をTCP/IPで通信するソフトを作っています。
arduinoがクライント、PCがサーバになるようにプログラムしています。

動作としましては、ボタン1でサーバを開始し、ボタン2でサーバ停止というプログラムになっています。

arduino側で 接続→送信→切断 のループのプログラムで動かすと上手くいくのですが、
初回接続後、接続しっぱなしで、arduinoからデータを送り続けるというパターンが上手くいきません。

下記プログラムの    Client = server.AcceptTcpClient   の部分が悪さをしている気がしました。
理由としては、arduinoからの接続要求が来ないのでサーバはダンマリ停止している状況だと判断しました。
使用するメソッドが間違っているのでしょうか?アドバイス頂けたらと思います。

Imports System.Net.Sockets
Imports System.Net
Public Class Form1
    Private Stop_Flg As Boolean
    Private server As TcpListener

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = ""
        Task.Run(Sub() DoWork())
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Stop_Flg = True
    End Sub

    Public Sub DoWork()

        server = Nothing
        Stop_Flg = False

        Try

            Dim port As Integer = 9000
            Dim localAddr As IPAddress = IPAddress.Parse("192.168.250.19")

            server = New TcpListener(localAddr, port)
            server.Start()

            Invoke(New Action(Sub()
                                  TextBox1.Text = "サーバー開始"
                              End Sub))

            Dim data As String = Nothing
            Dim Client As TcpClient = Nothing
            Dim NetStream As NetworkStream

            While Stop_Flg <> True 

                If server.Pending Then 

                    While Stop_Flg <> True

                        Client = server.AcceptTcpClient
                        NetStream = Client.GetStream
                        Threading.Thread.Sleep(100)  '相手からデータ到着までの待機時間

                        If NetStream.DataAvailable = True Then

                            Dim reader As New IO.BinaryReader(NetStream)
                            Dim bytes As Byte() = reader.ReadBytes(3)

                            For Each i In bytes
                                Console.Write(Chr(i)) ' "123" と表示される
                            Next

                            Console.Write(vbNewLine)
                            reader.Close()

                        End If

                    End While

                    Client.Close()

                Else
                    Threading.Thread.Sleep(0)
                End If

            End While

        Catch e As Exception
            MsgBox(e.ToString)
        Finally

            server.Stop()
            TextBox1.Text = "終了"

        End Try

    End Sub
End Class