毕设Mark!

虽然被批没得工作量,但还是把一些调试问题Mark一下,留点记忆。快点坑完,开店走人。。。

以前都能正常工作的一个函数,今天突然不行了,纠结了大半个下午这个问题,重启下电脑就好了。。。。无语了。。

串口异步通信非阻塞。一般使用多线程,,读操作和写操作在不同的线程里面,执行操作后会立即返回,而不管读写有没有成功,

在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞

最好还是用中断写串口,调了一两天的乱码的问题,从无线模块到串口,要么是最前面多个字符要么是最后少个字符,或是经常乱码(重复最后一个字符),但是奇怪的是两个程序的串口的可以,另外一个不行,都是用的查询方式,最后都改成中断的方式就行了

看来不是啥东西高级就好,以前的代码现在用就不行了,Vs2010默认的是unicode编码,好多东西都要先处理成宽字节,今天调了一天发现又是编码的问题,以前就遇到了很多的编码问题,包括Vs,python 等等,调试助手可以调通,自己写的就不行,不是不行,只是最多开始能发一两次正确的,之后就Over了

WideCharToMultiByte //unicode转多字符

在发送串口数据前使用此函数

另外优化经典的串口类CSerialPort的WriteChar函数,解决发送次数过多程序死机的问题

单步调试一点问题都没有,直接运行过段时间就会直接崩溃掉,在网上查了很多,和自己的想法差不多,要么是线程堵塞,要么是内存泄漏。特别是又涉及到数据通信相关,多线程问题尤其重要,最后屏蔽掉很多问题依旧在,不过缩小范围,锁定到了发送的部分。接着查看任务管理器,看该程序运行时占用内存在不断的增加,就知道肯定是内存泄漏了,首先就开始找new之类的部分,也锁定到了给串口发数据的部分,因为涉及到要把unicode转到多字节字符,就用到下面函数:

char * buf= new char[S_buf.GetLength()];

WideCharToMultiByte(CP_ACP, 0, S_buf, -1, buf,  S_buf.GetLength(), NULL, NULL);//unicode字符转多字符

m_Port.WriteToPort(buf,S_buf.GetLength());

app->m_Process_OK = false;

delete []buf ;

发现只有new 没有 delete。而且之前用的是new(),很明显这里要用数组, new[]配对delete []。

多回传一个字符串而且是发送过去的字符串,接收到的字符串是定义的两倍长度,即定义的是10,收到的是20 长度的,其中前10 是正确的,后10 就是刚刚发送到下位机的,原来是extern的缘故

时序和逻辑很重要

看来我的灵感一般是在吃饭,上厕所,睡前三种情况下才能闪现啊。

组网:

1.由主机寻找所有从机,即连续发送要找的所有从机地址(有问题,以前的方法)

2.从机主动找主机。比较麻烦。

3.主机寻找第一个从机,再第一个接力下去(现在开始实验)

语境运算