You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CANoe结合C#接收UDP消息运行异常问题及参考示例求助

CANoe C# UDP接收实现方案及问题修复

原代码核心问题

  • 测试方法内定义的UdpClient是局部变量,方法执行完后会被GC回收,异步接收回调触发时访问已释放的对象,直接导致节点崩溃
  • 使用Thread.Sleep阻塞CANoe主线程,违反CANoe测试模块的线程调度规则,是节点意外停止的核心诱因
  • 收发使用两个独立的UdpClient实例,发送端没有绑定监听端口0xC09F,若ECU是向请求的源端口回包,监听0xC09F的客户端将收不到响应
  • PingTest方法语法不完整,缺少闭合的大括号
  • 回调方法没有异常捕获逻辑,接收出错时直接抛出未处理异常导致节点退出
  • 单次调用BeginReceive只能接收一次数据包,没有做连续接收的复用逻辑

可用的参考实现代码

using System;
using System.Net;
using Vector.Tools;
using Vector.CANoe.Runtime;
using Vector.CANoe.Threading;
using Vector.CANoe.TFS;
using Vector.CANoe.Sockets;
using NetworkDB;

public class TestPingBroadRReach1 : TestModule
{
    private byte channel = 6;
    private ushort pingCount = 0;
    public static bool messageReceived = false;
    // 将UdpClient定义为类成员变量,避免被GC提前回收
    private UdpClient _udpClient;
    private IPEndPoint _localEndPoint;

    public struct UdpState
    {
        public UdpClient u;
        public IPEndPoint e;
    }

    public override void Main()
    {
        PingTest();
    }

    [TestCase("SYS4_TC4321", "BroadR-Reach 1: Ping test", "Checks if a ping is answered on BroadR-Reach 1")]
    public void PingTest()
    {
        Report.TestStep("Setup UDP client.");
        // 同一个UdpClient兼顾收发,绑定本地监听端口
        _localEndPoint = new IPEndPoint(IPAddress.Any, 0xC09F);
        _udpClient = new UdpClient(_localEndPoint);

        UdpState s = new UdpState();
        s.e = _localEndPoint;
        s.u = _udpClient;

        // 启动异步接收
        _udpClient.BeginReceive(new AsyncCallback(UdpReceiveFinished), s);

        Report.TestStep("Send ping request.");
        byte[] pingRequest = CreatePingRequest();
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.80"), 0xBB9);
        
        // 直接发送不需要额外Connect
        _udpClient.BeginSend(pingRequest, pingRequest.Length, remoteEndPoint, new AsyncCallback(UdpSendFinished), _udpClient);

        Report.TestStep("Wait for ping response.");
        int waitCount = 0;
        while (!messageReceived && waitCount < 50)
        {
            // 用CANoe自带的Wait方法替代Thread.Sleep,不阻塞主线程
            Execution.Wait(100);
            waitCount++;
        }

        if (messageReceived)
        {
            Report.TestStepPass("Ping response received.");
        }
        else
        {
            Report.TestStepFail("Ping response timeout.");
        }

        // 测试结束后释放资源
        _udpClient.Close();
        _udpClient.Dispose();
    }

    private void UdpSendFinished(IAsyncResult result)
    {
        try
        {
            UdpClient u = (UdpClient)result.AsyncState;
            u.EndSend(result);
            Output.WriteLine("UDP ping request sent successfully.");
        }
        catch (Exception ex)
        {
            Output.WriteLine($"UDP send error: {ex.Message}");
        }
    }

    private void UdpReceiveFinished(IAsyncResult ar)
    {
        try
        {
            UdpState state = (UdpState)ar.AsyncState;
            IPEndPoint remoteEp = new IPEndPoint(IPAddress.Any, 0);
            byte[] receiveBytes = state.u.EndReceive(ar, ref remoteEp);
            
            Output.WriteLine($"UDP response received from {remoteEp.Address}, length: {receiveBytes.Length}");
            messageReceived = true;

            // 如果需要连续接收,这里可以再次调用BeginReceive
            // state.u.BeginReceive(new AsyncCallback(UdpReceiveFinished), state);
        }
        catch (ObjectDisposedException)
        {
            // 客户端已主动释放,忽略异常
        }
        catch (Exception ex)
        {
            Output.WriteLine($"UDP receive error: {ex.Message}");
        }
    }

    private byte[] CreatePingRequest()
    {
        // 这里补充你自己的ping请求构造逻辑
        pingCount++;
        return new byte[] { 0x01, 0x02, 0x03, 0x04 };
    }
}

关键注意点

  • CANoe的.NET测试环境禁止长时间阻塞主线程,所有等待操作必须使用Execution.Wait替代Thread.Sleep
  • 异步操作使用的资源对象要定义为类成员,避免局部变量被GC提前回收
  • 所有回调方法必须添加异常捕获,未处理的异常会直接终止CANoe测试节点
  • 如果是基于BroadR-Reach的车载以太网通信,需要提前在CANoe的Hardware配置中将对应通道的以太网控制器设置为正确的链路模式,确保物理层连通正常

内容的提问来源于stack exchange,提问作者mwolfart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:15:03