下面这个问题是基于程序6-12libmodbus_all_uart来实现的
1.在keil中监控局部变量,必须在该函数内部断点进行访问,不然是访问不到这个变量的实际内容的
所以目前问题,进一步定位在,为什么信号量无法正确的创建,好无奈的,按道理调用的是官方API,不应该有问题的
挺实用的,从malloc分配错误,倒推看是谁触发的
找到第一个原因,是因为这个函数,多次进行申请内存,直到把堆的内存都用完,然后程序崩掉
修改完之后,程序直接进入HardFault,开始排查第二个问题
这个问题无法复现,我记得我只修改了ClientTask任务的堆栈大小,就没问题了。可是我尝试改回来以复现这个问题的时候,无法复现,仿佛这个问题没有出现过
第二个问题:ux_device_cdc_acm_send这个usb串口发送根本没有得到运行,有这种事情????看我一步一步调试
sprintf(str,"ctx->backend->_modbus_rtu_send_msg_pre:%X,ctx->backend->_modbus_rtu_send:%X",
(uint32_t)ctx->backend->send_msg_pre,
(uint32_t)ctx->backend->send);
我去,这两个函数的地址是一样的,都是800CC48D,逆天怎么会这样。继续debug,就很奇怪。我一开始以为是(uint32_t)ctx->backend->send_msg_pre,
(uint32_t)ctx->backend->send这两个函数名称前缀一样导致keil犯糊涂,于是将send函数改为xsend函数,然后这两个函数地址确实不一样了,但是_modbus_rtu_xsend又和_modbus_set_slave地址重复,我真不理解了啊,太逆天了,应该是哪里出问题了
有图有证据
找到问题了,使用下面注释的代码,即使用未初始化指针,就会出现这个问题,
解决完这个问题,就可以执行到这个函数了ux_device_cdc_acm_send
不过呢,貌似数据还是没有发出去,有点不知道为什么了,很奇怪,明明执行ux_device_cdc_acm_send这个底层函数,怎么还会失败呢
找到问题所在啦,是这个没有定义,我猜测应该是UX_STANDLONE在cubemx生成的过程中被不小心去掉了这个原因
还好我尝试了一下,之前看到这页代码有这个#define声明都不打算尝试这个可能,还好我进入内部代码看了一下发现#define相关声明下的函数是灰色的,虽然可能是keil反应慢导致的,但是还好尝试了一下
真是酣畅琳琳的调试的一天啊,这个作为面试问到你遇到的最大的困难是什么中进行回答
3.在写板载串口互相收发数据时,又遇到了问题
第一个问题,还是卡死在assert(queue)中,一看是我没有调用pdev->init函数,导致没有创建队列,很好解决
第二个问题,根据接收不到数据,我将断点打在串口接收中断函数中,包括空闲中断和队列接收函数中,都是不行的,表明串口4根本没有接收到程序
突然又可以了,可能是需要一定的反应时间,本来人家已经接收到消息,我等不及直接开启仿真了,所以说有的时候不能着急,这次仿真有点可惜,没学到具体的debug经验,就是提升了熟练度,还有心态。不然被bug搞心态
4.关于SSCOM无法和W800建立网络连接的问题
一开始遇到这个问题就是老办法,抓瞎。一重试,二是换个网络调试助手,都不出意味的没有效果。后来问GPT,GPT说先尝试ping一下看看能不能ping通,然后一尝试确实没有ping通,因为电脑和W800没有处于同一网段,后来把笔记本电脑和W800都连接在热点上就解决这个问题了
你可能会问为什么一开始不直接把电脑也连接到手机热点上试试呢?因为我一开始手机热点设置的最大设备连接数是1,导致电脑一直连接不上去,我又觉得不是同一个网络又没有关系,其实是有关系的,连接同一个网络是保证ip地址在同一网段最简单的办法