现象:单片机与服务器双向通信,服务器发一次数据等待单片机响应,响应完成继续发送,没有响应等待1秒再次发送;单片机向服务器发送数据同理。测试进行了几万次数据交流,发现一个规律:服务器向单片机发送的数据单片机都能够接收,而且正常回应,服务器也能够全部收到,例如服务器发了10000次数据,单片机就能够收到10000次数据也能响应服务器10000次。而单片机向服务器发送的请求,服务器却不一定能够全部收到,但是只要服务器收到的请求,都能够做出响应,比如单片机发出了10000次数据,但是服务器却直接受到了9990次,也给单片机响应了9990次,丢了10次。
遇到这个问题后怎么想也想不明白,为什么单片机响应服务器的数据一个没丢,但是请求服务器的数据却会丢呢?
调试过程:将测试次数减少,只要发生丢失数据的情况就立即停止。于是单片机与服务器继续通信,在丢失第一个数据的时候停下来查看状态,发现单片机发送请求的同时,服务器也在发送请求。那么为什么单片机的请求却失败后没有再次发送?回到单片机的代码当中发现在CAN模块初始化的时候禁止自动重发的功能为使能状态,也就是单片机在发送数据的时候,只发送一次,即使发送失败了也不会去管,而是返回发送完成的状态。所以,单片机在与服务器端用的以太网转CAN模块的较量当中,丢掉了数据,服务器发送成功。
那么,还有一个问题,就是为什么单片机给服务器发的响应都会成功?这与上层代码的逻辑有关,因为服务器向单片机发送完请求后会等待单片机响应,此时的总线只有单片机在占用,所以单片机发的相应数据会每次都成功。
后来,使用了单片机的自动重发功能后再次测试,发现单片机发出的请求没有发生丢包的现象。
查阅STM32的数据手册,发现这个自动重发功能如果启用,当单片机检测到发送数据失败后会一直重发,直到成功。而如果不用这个功能,则单片机的CAN控制器只发一次数据,不去换结果如何。
关键字:STM32 CAN 总线调试 以太网 CAN联调
引用地址:
STM32的CAN总线调试——与以太网转CAN联调的小问题
推荐阅读最新更新时间:2024-11-02 07:32
STM32 CAN总线传输波特率的计算
本人用的单片机是STM32F407,其它型号的单片机类似,可做参考! 一、标准CAN协议位时序概念 由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯。 同时,CAN还使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。 为了实现这个位同步,CAN协议将每个位的时序分解为四段:SS段、PTS段、PSB1段、PBS2段。同时定义最小的时间单位:Tq,四个段的长度用x个Tq表示,加起来就是一个位的时序。 用一个图来表示可能会形象一点,如图一个位的时序就是19Tq。 以上就是CAN标准协议定义的位时序,而S
[单片机]
STM32 位带应用
Cortex-M3 支持了位操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。 在 CM3 支持的位带中,有两个区中实现了位带。 其中一个是 SRAM区的最低 1MB 范围, 0x20000000 ‐ 0x200FFFFF(SRAM 区中的最低 1MB); 第二个则是片内外设区的最低 1MB范围, 0x40000000 ‐ 0x400FFFFF(片上外设区中的最低 1MB)。 这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的 位带别名区 ,位带别名区把 每个bit膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。 如RAM 地址0x200
[单片机]
STM32使用ADC功能
1.关于ADC输入通道与GPIO口的输入关系需要查看STM32芯片手册(p31)而非数据手册。 2.外部触发源指的是触发ADC采样的触发信号,这与1的GPIO口输入是两个不同概念。而JEXTBEL 或者EXTBEL 决定具体是哪个触发源。 3.大的方向,触发模式分为了 ADON位触发启动和外部触发启动ADC转换两种。用后者就行了 4.当我们使用一个ADC要采集多个通道时,单独规则组由于只使用了一个数据寄存器,并且是整个组转换完后才会触发中断,因此数据会覆盖,这种情况下需要使用DMA方法(后面采用试试),这时数据写到SRAM中了。而单独使用注入组总共可最多有四个通道,对应四个数据寄存器,不存在覆盖。 5.关于注入通道
[单片机]
基于STM32四轴飞行器电路设计的详细图解资料概述
四轴飞行器是一种利用四个旋翼作为飞行引擎来进行空中飞行的飞行器。进入20世纪以来,电子技术飞速发展四轴飞行器开始走向小型化,并融入了人工智能,使其发展趋于无人机,智能机器人。 四轴飞行器不但实现了直升机的垂直升降的飞行性能,同时也在一定程度上降低了飞行器机械结构的设计难度。四轴飞行器的平衡控制系统由各类惯性传感器组成。在制作过程中,对整体机身的中心、对称性以及电机性能要求较低,这也正是制作四轴飞行器的优势所在,而且相较于固定翼飞机,四轴也有着可垂直起降,机动性好,易维护等优点。 系统方案 本设计采用STM32F4作为核心处理器,该处理器内核架构 ARM Cortex-M4,具有高性能、低成本、低功耗等特点。 设计总体框图
[单片机]
基于AT89C51的CAN总线智能节点设计
1 引言 CAN(Controller Area Network)是控制器局域网,主要用于各种设备检测及控制的现场总线。CAN总线是德国BOSCH公司20世纪80年代初为解决汽车中众多控制与测试仪器间的数据交换而开发的串行数据通信协议。这是一种多主总线,无论是在高速网络还是在低成本的节点系统,应用都很广泛。由于采用了许多新技术及独特的设计,与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性,其主要特点如下: ●通信方式灵活,可以多主方式工作,网络上任意一个节点均可以在任意时刻主动向网络上的其他节点发送信息,不分主从。 ●CAN节点只需对报文的标识符滤波即可实现点对点、点对多点及全局广
[单片机]
stm32 time4 pwm
pwm.h #ifndef _PWM_H #define _PWM_H #include sys.h void TIM14_PWM_Init(u32 arr,u32 psc); #endif pwm.c #include pwm.h //TIM4 PWM部份初始化 //PWM 输出初始化arr:自动重装值 psc:时钟预分频系数 void TIM14_PWM_Init(u32 arr,u32 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_O
[单片机]
STM32启动文件的选择及宏定义 及芯片型号更改 IAP总结
startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM3
[单片机]
STM32中GPIO的8种工作模式
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总
[单片机]