【嵌入式开发】来自一个半年没写代码的憨憨的Bug修复记录

这几天想自己弄一个轻量的单片机一对一通信协议,我总觉得没问题然后就一口气把程序写完都不带任何一个函数的单独测试的,自信满满的来了一波测试。

有时候程序员一定要相信自己总会在某一时刻是个憨憨,虽然没有Error,但是两个逻辑错误,一个语法错误,这个语法错误我简直了,在哪看了半天还怪编译器,结果是自己函数调用居然没带括号。

同时也说说自己的心得吧,这个学期学了计算机网络,正好赶上这几天要暂时在学校不回家,所以心血来潮想借鉴TCP/IP的思路来写一个满足单片机一对一的简单通信的协议。

按照以往失败的经验这次我是首先先写出来自己的标准来,然后再根据自己的标准写下了程序思路然后再是程序框架,最后上手写代码,和以前比起来虽然犯了几个错误,但是效率和成果都非常的好,所以写程序的时候特别是代码量有点大的时候就不要直接写代码,而是一步步,按照上面的顺序来,写个计划书,这样思路不会乱,并且这样如果过了很久再看自己的程序看不懂了也可以找到以前写的计划书看看自己当时的思路。

其次就是学习计算机网络的时候我又注意到的一个问题,这在其他很多学科中应该都有的,就是有些不重要的概念如果觉得分不清其实可以不用管它,例如网桥是网络层还是数据链路层的设备,这个问题本身没有多大意思,甚至有些概念连协议制定者们都搞不清,应为那个其实不重要。

我是觉得工科的东西要抓有用的,不要那些有的没的不用的东西揪着不放,毕竟时代是在变的,30年前

张华考上了北京大学;
李萍进了中等技术学校;
我在百货公司当售货员:
我们都有光明的前途。
这是真的。
30年后“我们都有光明的前途。”倒成了一句调侃的话。
技术这个也是这样淘汰的太快,我们没有必要想背诵历史那样记住他们。


测试1:使用TM32单片机发送系统控制报文到电脑,通过串口就收软件接收,检查报文是否正确

测试材料:STM32单片,程序下载器,USB转串口,串口软件。
测试内容:发送TCMP_NORMAL到计算机。

测试硬件是否正常:
检查连接正常:
在这里插入图片描述
检查USB转串口接入正常:
在这里插入图片描述
测试信息:在这里插入图片描述
测试异常:乱码

在这里插入图片描述
检查波特率设置正常。在这里插入图片描述


直接将USB转串口的RX与TX连接,检查USB转串口是否正常:USB转串口正常。
在这里插入图片描述


重新编译单片机程序后测试:串口通信正常
在这里插入图片描述
中文编译时编码有误
在这里插入图片描述
在这里插入图片描述
修改为UTF-8测试:失败在这里插入图片描述
将文件通过记事本打开,将其由UTF-8另存为ANSI解决。

在这里插入图片描述

sb Keil


测试发送TCMP_NORMAL报文到电脑:

在这里插入图片描述
编译错误:

在这里插入图片描述
包含头文件解决。

第一次发送失败:注意到忘记添加控制码虽然这个不是原因。

在这里插入图片描述


转到VS2019进行Debug:
找到错误:只考虑了有特殊字符在数据中的情况

这tm什么鬼

在这里插入图片描述
修改后:
在这里插入图片描述

第二次错误

再次编译下载:接收到数据,理论上发送出来的帧应该有13字节。这里出现两个问题:接收到的帧不全只有12字节,其次同一个帧发送了多次,而且越来越快。
原因判断:忘记给帧的首位做封装了
忘记清空帧缓存区了。
在这里插入图片描述
修复1.
在这里插入图片描述
问题2暂时没有找到原因,直接测试修复1.:总共有14字节,检查发现是因为报文中含有SOH.测试正常。在这里插入图片描述
问题2.在检查后发现原来是有清空帧缓存区了的,所以可能的原因是因为发送速度过快,关闭窗口后又打开造成的。但是我是每隔离一段时间发送一次,所以似乎还有别的原因。每次收到的大概字节数29 71 127
在这里插入图片描述
修改主函数:

	while(1)
	{
			times++;
			if(times%1000==0){//1s钟发送一份。
				//printf("Your messages/你的消息\n");  
				Send_Ctrl_TCMP(TCMP_NORMAL,NULL,0);
			}
			delay_ms(1);   
	}

VS Debug发现Empty_Frame_Buf被直接略过了,确实就是没有清空帧缓存区了造成的。Fuck!
在这里插入图片描述
我猜测是是编译器优化代码造成的:原来的代码如下

u_int32_t Empty_Frame_Buf()
{
	Global_TCMP_Frame_Buf_Len = 0;
	return NULL;
}

可以这样直接修改Global_TCMP_Frame_Buf_Len的值不被忽略。在这里插入图片描述
这样修改是生效的:
在这里插入图片描述
来给Empty_Frame_Buf()加点东西,但是任然无法执行它。百度吧

u_int32_t Empty_Frame_Buf()
{
	Global_TCMP_Frame_Buf_Len = 0;
	printf("bcjbcjkbwrbvfiwbvkrw");
	return Global_TCMP_Frame_Buf_Len;
}

我随便写了一个函数放到这里:没有被忽略
在这里插入图片描述

u_int32_t lili()
{
	printf("Funck!");
}
第二次错误就是那个调用函数还不代括号的错误

好了,不说了,不知道谁看到这会不会被笑死,我就是个大傻逼。这这回正常了,呜呜呜,不说了,多休息。


剩余测试项目:warning检查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值