之前本科毕设的问题找了好久,前一阵子虽然找到了问题的结症所在——可以正常显示波形,不再杂乱无章的瞎比跳——但具体底层原因我还是有些一头雾水。
当时的问题有如下几个:
1、傻傻的以为必须要用标志字节才能判断后面紧跟着的高位和低位字节,这样一个16位加速度值就要三个字节来传输。最开始我以为波形异常出现在标志位这里。
某一天灵机一动索性不妨先降低精度,在发送端只传输高八位,这样岂不是也不需要标志字节了?!因为每一个字节都代表了独立的一个加速度!
查询我当时记录的日志,可以发现以8位传输波形无问题。
我当时借回来好多书,发现书上也并没有使用标志位!我尝试着按照< 李江全> 的某本书籍改动我的代码,突然发现问题在于我的移位过程!
其实直接用乘法和加法就不会出现问题!(图中是有错误的)
(其实现在想来,原来的代码可能不需要考虑到负数和移位,所以强制换成char问题也不大。但我这里就不能这样用了,因为加速度有负数。)
昨天学习了<鸡啄米>网站上的相关c++的知识,突然看到了相关的移位知识,觉得看到了希望!
于是昨天晚上和今天上午进行了相关的测试。
其中用到了按照二进制输出的方法,可以看到数据的每一位。
恍然大悟的发现:
2、之所以我的向左移位(乘法)会出先错误,是因为“+”的优先级大于“<<”,这个错误比较弱智,结论就是没事儿加几个括号是好习惯;还有基础知识的重要性!
3、把 short int 拆开赋值给两个 unsigned char 这里不会出现问题。问题就出现在后面移位和加法的数据类型上!
如果short int 本身是个负数,那么char1 的最高位就是1,再左移8位、右边补0,貌似也不会出现问题。
问题出现在char2上。那么在与(char1<<8)相加再赋值给short int时,应该会被先转换成short int。
如果此时char2碰巧最高位是1,那么问题来了:按照默认unsigned char类型,前面补0,没有问题。
如果强制转换成(char),那么前面会自动补1!那么再与(char1<<8)相加时,显然结果和预期的不一致!
反思:
1、基础知识还是不扎实,所以我觉得花一点时间在基础知识上还是必要的。
2、再遇到这种情况可以在c++中试验一下,像这次试验一样,可以省去好多不必要的弯路。重在要有试验和测试的思想,不要总是在实际项目中苦苦测试,要走出来,再走进去。
参考:
1、http://www.jizhuomi.com/software/32.html
2、李江全.《visual studio串口通信与测控应用编程实践》