【问题标题】:cannot receive UDP Packet from microcontroller无法从微控制器接收 UDP 数据包
【发布时间】:2014-10-07 06:20:20
【问题描述】:

我目前正在通过以太网开发 UDP 通信 PC ARM LM3S6965 (Luminary)。在 PC 上有一个模拟 UDP 服务器/客户端的 VB.net 应用程序。

当数据包从 PC 发送到 ARM LM3S6965 时,数据包被正确接收,但是当 ARM LM3S6965 将 UDP 数据包发送回 PC 时,数据包在某处丢失(应用程序没有收到它)。

奇怪的是,WireShark 会捕获这些到达 PC 的数据包,而且它们似乎是有效的。

在 Windows 中关闭防火墙没有帮助。我知道这个主题对于这个论坛来说可能是错误的,但是任何人都可以解释为什么 WireShark 会捕获这些数据包,而我的应用程序却没有? ARM LM3S6965 (192.168.0.100),PC (192.168.0.116),发送和接收通过端口号 3040,我正在从 ARM LM3S6965 微控制器接收的 VB.Net 应用程序发送广播消息。

这是 VB.net 代码:

Public Const mnPort As Int16 = 3040                             'Port number to send/recieve data on
Public Const msBroadcastAddress As String = "255.255.255.255"   'Sends data to all LOCAL listening clients, to send data over WAN you'll need to enter a public (external) IP address of the other client
Public udpReceivingClient As UdpClient                          'Client for handling incoming data
Public udpSendingClient As UdpClient                            'Client for sending data
Public receivingThread As Thread                                'Create a separate thread to listen for incoming data, helps to prevent the form from freezing up
Public mbiClosing As Boolean = False                            'Used to close clients if form is closing


Public Sub InitializeSender()
    udpSendingClient = New UdpClient(msBroadcastAddress, mnPort)
    udpSendingClient.EnableBroadcast = True
End Sub

Public Sub InitializeReceiver()
    udpReceivingClient = New UdpClient(mnPort)
    'Dim start As ThreadStart = New ThreadStart(AddressOf MT_Receiver)
    'receivingThread = New Thread(start)
    'receivingThread.IsBackground = True
    'receivingThread.Start()
End Sub

Public Sub MT_Send_UDP(ByVal lbTxBuffer() As Byte)

    Try
        udpSendingClient.Send(lbTxBuffer, lbTxBuffer.Length)
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

    Try
        udpReceivingClient.BeginReceive(AddressOf MT_RX_Callback, Nothing)
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Public Sub MT_RX_Callback(ByVal IR As IAsyncResult)
    Dim endPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 3040)
    Dim lbData() As Byte
    Dim llRet As UInt16
    If mbiClosing = False Then
        llRet = udpReceivingClient.Available
        lbData = udpReceivingClient.EndReceive(IR, endPoint)

        If llRet > 0 Then
            MT_Validate_Msg(lbData)
        End If

        udpReceivingClient.BeginReceive(AddressOf MT_RX_Callback, Nothing)
    End If
End Sub

Private Sub frmSearchUDP_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    mbiClosing = True

    udpReceivingClient.Close()
    udpSendingClient.Close()
    frmMain.Timer.Enabled = True
End Sub

Private Sub frmSearchUDP_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    InitializeSender()
    InitializeReceiver()

End Sub

【问题讨论】:

  • 投反对票的人应该评论为什么?
  • 请出示一些你的VB代码和一个wireshark数据包
  • @jeb 我怎么给你看wireshark数据包??
  • 好的,这里是 cloudshark 链接,请参考行号。 196 和 197。link

标签: vb.net embedded microcontroller udpclient


【解决方案1】:

再来个评论,但是太长了……

No196:42.430628
从 192.168.0.168 -> 255.255.255.255(从您的 PC 到您的硬件)
UDP ...源端口:63162 (63162)
目的港:tomato-springs (3040)

这看起来不错,而且很明显,因为您的硬件会发送响应。

No197:42.431017
从 192.168.0.100 -> 255.255.255.255(从您的硬件到您的 PC)
源端口:tomato-springs (3040)
目的端口:63162(63162)

为什么你的电脑会收到这个数据包?
目的端口是 63162,但你监听的是 3040 端口。

【讨论】:

  • 当我将其修复为 3040 时,监听端口如何变化?现在我进行了一些实验,我保留了发送方端口 3040 并将侦听端口更改为 63162,但是当我捕获到 Wireshark 目标端口更改为 61923 然后再次更改为 51120 的数据包时?我如何捕获数据包?
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 2017-06-15
  • 2017-10-13
  • 2011-03-02
  • 2015-11-26
  • 2014-12-13
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多