上位机中的CAN-TP网络层参数整定

CAN-TP 层位于 UDS诊断层和CAN Driver层中间,主要作用是:当CAN数据长度超过8Byte(CAN-FD为64Byte)时,对CAN数据进行分包和解包。

9411a58bc09f74231e52ef1744f57930.png

网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数,各个参数的含义下两张图可以完整的体现,以下会对各个参数进行详细说明。

704f274bfc4b2a32bbc1fb99bad856ae.png

format,png

首先需要明确几个概念

  • N_USData : 网络层数据
  • L_Data : 数据链路层数据
  • .req : 帧发送开始请求
  • .con : 帧发送完成确认
  • .ind : 帧接收完成指示

※ Send 侧的 .con 和Receiver侧的 .ind是一个时间点。

注意:上位机在tp层通信时作为Sender即发送方,故以下参数后缀为s的对Sender有效,后缀为r的应在下位机即BootLoader中进行设置。

下面对每个参数进行详细解释:

1. N_As/N_Ar

dafe27db0bb20f747209575858a2e1db.png

1.1. N_As

Sender.req->Sender.con ,Sender 任意帧类型 从请求发送到发送完成 的时间间隔,任意帧类型包括:单帧、首帧、连续帧、流控帧,Sender发送的报文帧不包含流控帧

根据需要,N_As应设置为70ms,以下为上位机源码:

uint n_as = 0x70000; //将N_As参数设置为70ms,单位为μs

cantp_status status = CanTpApi.SetValue_2016(

(cantp_handle)Channel,cantp_parameter.PCANTP_PARAMETER_TIMEOUT_AS,

ref n_as, (uint)Marshal.SizeOf(n_as)); //将70ms写入

由于N_As为最大超时时间,这里的波形图为发送方发出的N_PCI(Protocol Control Information,协议控制信息)

  • 单帧

eb0417be18ae27e6a912e2e7395f2b30.png

  • 首帧

c09214c7faa068b6fa324d582106574b.png

  • 连续帧

6c535fec70ff0d519246b08ab546b7a6.png

1.2. N_Ar

Receiver.Req->Receiver.con , Receiver 任意帧类型 从请求发送到发送完成 的时间间隔,在上位机中设置无意义。

2. N_BS/N_Br

2.1. N_Bs

可理解为 Sender 从XXX 收到流控帧 的时间,XXX分为三种情况:

① Sender 从 发送完首帧(FF)到 收到流控帧 的时间

1365fde0e128843068af872fe3a4d02f.png

② Sender 从 发送完连续帧(CF)到 收到流控帧 的时间

6c917896ca597929c4232db61b510ef7.png

③ Sender 从 收到流控帧(FC)(状态为Wait)到 收到下一个流控帧 的时间

95a14eb3457854ab5528ed57fc9bed3d.png

在X1VCU诊断调查表中,N_Bs应设置为150ms,源码如下:

uint n_bs = 150000; //将N_Bs参数设置为150ms,单位为μs

status = CanTpApi.SetValue_2016(

(cantp_handle)Channel, cantp_parameter.PCANTP_PARAMETER_TIMEOUT_BS, ref n_bs, (uint)Marshal.SizeOf(n_bs));

由于N_Bs为最大超时时间,这里仅展示三种发送方发出的N_PDU,标号与三种情况说明一一对应:

① Sender 从 发送完首帧(FF)到 收到流控帧 的时间:302μs左右

a483c76993ec6e7d5e397d4be8e7da00.png

② Sender 从 发送完连续帧(CF)到 收到流控帧 的时间:302μs左右

6bfd3ad248797df9c8e7d6faf5c9341c.png

③ Sender 从 收到流控帧(FC)(状态为Wait)到 收到下一个流控帧 的时间:141ms左右

2d356fef70109792ba35995fd0c988d4.png

2.2. N_Br

可理解为 Receiver 从XXX 请求发送流控帧 的时间,XXX分为三种情况,在上位机中设置无意义。

① Receiver 从 收到首帧(FF)到 请求发送流控帧 的时间

63b97c1f763bf20f6e33057f5c29e635.png

② Receiver 从 收到连续帧(CF)到 请求发送流控帧 的时间

04726a02204a4665639ad40a0c223f08.png

③ Receiver 从 发送完流控帧(FC)(状态为Wait) 到 请求发送下一个流控帧 的时间

71985a1cee056b9d3a6e6c6e3f6f3c6e.png

3. N_CS/N_Cr

3.1. N_Cs

可理解为 Sender 从XXX 请求发送连续帧(CF) 的时间,XXX分为两种情况

① Sender 从 收到流控帧(FC)到 请求发送连续帧(CF) 的时间

59f578c4a20263ce4cf5b85aeec64c40.png

② Sender从 发送完连续帧(CF)到 请求发送下一包连续帧(CF) 的时间

d49d234cfa37be4f72de4d7c259481cf.png

在需求中,N_Cs应设置小于70ms,源码如下:

uint n_cs = 0x01; //将N_Cs参数设置为1ms,单位为ms

cantp_status status = CanTpApi.SetValue_2016(

(cantp_handle)Channel, cantp_parameter.PCANTP_PARAMETER_SEPARATION_TIME_TX, ref n_cs, (uint)Marshal.SizeOf(n_cs));

在逻辑分析仪中,N_Cs表现为以下两种情况:

① Sender 从 收到流控帧(FC)到 请求发送连续帧(CF) 的时间

52c88efeb67058abde4f36620e4a99c5.png

② Sender从 发送完连续帧(CF)到 请求发送下一包连续帧(CF) 的时间

3bf31a8e42b10e1d1a4a3fb63d304bf0.png

3.2. N_Cr

可理解为 Receiver 从XXX 收到下一个连续帧(CF) 的时间,XXX分为两种情况,在上位机设置该参数无意义。

① Receiver 从 发送完流控帧(FC)到 收到连续帧(CF) 的时间

fda2b0f0c60281d893340d48a85975f1.png

② Receiver 从 收到连续帧(CF)到 收到下一包连续帧(CF) 的时间

 

8096458ad8b1e5b3e0f11ddd0f55506e.png

 

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
网络通信是C#上位机开发非常重要的一部分,下面是C#上位机开发教程网络通信篇的一些内容: 1.使用Socket进行TCP通信 ```csharp // 服务器端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; TcpListener listener = new TcpListener(ip, port); listener.Start(); Console.WriteLine("服务器已启动,等待客户端连接..."); TcpClient client = listener.AcceptTcpClient(); NetworkStream stream = client.GetStream(); byte[] data = new byte[1024]; int length = stream.Read(data, 0, data.Length); string message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine("接收到客户端消息:" + message); stream.Write(Encoding.UTF8.GetBytes("服务器已接收到消息"), 0, "服务器已接收到消息".Length); stream.Close(); client.Close(); listener.Stop(); // 客户端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; TcpClient client = new TcpClient(); client.Connect(ip, port); NetworkStream stream = client.GetStream(); string message = "Hello, Server!"; byte[] data = Encoding.UTF8.GetBytes(message); stream.Write(data, 0, data.Length); data = new byte[1024]; int length = stream.Read(data, 0, data.Length); message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine("接收到服务器消息:" + message); stream.Close(); client.Close(); ``` 2.使用Socket进行UDP通信 ```csharp // 服务器端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; UdpClient server = new UdpClient(port); IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); byte[] data = server.Receive(ref remote); string message = Encoding.UTF8.GetString(data, 0, data.Length); Console.WriteLine("接收到客户端消息:" + message); server.Send(Encoding.UTF8.GetBytes("服务器已接收到消息"), Encoding.UTF8.GetBytes("服务器已接收到消息").Length, remote); server.Close(); // 客户端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; UdpClient client = new UdpClient(); IPEndPoint remote = new IPEndPoint(ip, port); string message = "Hello, Server!"; byte[] data = Encoding.UTF8.GetBytes(message); client.Send(data, data.Length, remote); data = client.Receive(ref remote); message = Encoding.UTF8.GetString(data, 0, data.Length); Console.WriteLine("接收到服务器消息:" + message); client.Close(); ``` 3.使用HttpWebRequest进行HTTP通信 ```csharp string url = "http://www.example.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); StreamReader reader = new StreamReader(stream, Encoding.UTF8); string result = reader.ReadToEnd(); Console.WriteLine(result); reader.Close(); stream.Close(); response.Close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

您猜我猜不猜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值