12回答

0收藏

删除

STMCU STMCU 3805 人阅读 | 12 人回复 | 2016-05-12

本帖最后由 我是小白ljj 于 2016-5-16 12:58 编辑

已删
分享到:
回复

使用道具 举报

回答|共 12 个

倒序浏览

沙发

我是小白ljj

发表于 2016-5-12 13:02:32 | 只看该作者

串口接收的图片在这

串口调试截图.png (23.65 KB, 下载次数: 40)

串口调试截图.png
板凳

荣丰宇

发表于 2016-5-12 13:24:50 | 只看该作者

以下只是我的观点
出现‘00’是很有问题的吧。他可能会造成字符串接收的误会吧
地板

我是小白ljj

发表于 2016-5-12 13:27:05 | 只看该作者

荣丰宇 发表于 2016-5-12 13:24
以下只是我的观点
出现‘00’是很有问题的吧。他可能会造成字符串接收的误会吧
...

大神,您在帮着看下,还有没有别的问题,我先修改下您说的问题,看下效果
5#

我是小白ljj

发表于 2016-5-12 14:08:19 | 只看该作者

大神,你好,我按照您说的作了修改,并将主程序中的 Angle[i-1]=(float)((sbus_rx_buffer[2*i]|sbus_rx_buffer[2*i+1]<<8)/100.0);
修改为Angle[i-1]=(float)(sbus_rx_buffer[i+1]/100.0);
修改后调试助手显示接收到的数据已经没有“00”了,
但实际接收到的数据全是1.28.
我觉得是串口2的中断服务程序出了问题,但是我找不出来,您能看下嘛
6#

我是小白ljj

发表于 2016-5-12 14:29:52 | 只看该作者

荣丰宇 发表于 2016-5-12 13:24
以下只是我的观点
出现‘00’是很有问题的吧。他可能会造成字符串接收的误会吧
...

大神,你好,我按照您说的作了修改,并将主程序中的 Angle[i-1]=(float)((sbus_rx_buffer[2*i]|sbus_rx_buffer[2*i+1]<<8)/100.0);
修改为Angle[i-1]=(float)(sbus_rx_buffer[i+1]/100.0);
修改后调试助手显示接收到的数据已经没有“00”了,
但实际接收到的数据全是1.28.
我觉得是串口2的中断服务程序出了问题,但是我找不出来,您能看下吗?

7#

荣丰宇

发表于 2016-5-12 14:56:58 | 只看该作者

我是小白ljj 发表于 2016-5-12 14:29

你程序的意思是:上位机将float转换为short,再打包发送AA等一串数据字节到板子上,板子接收取出来,重新换成float进行GO()函数做处理
下方的图片应该是pc上位机发出的数据吧,看上去没有错误
如果单片机的配置部分程序没有问题的话,问题就出在void USART2_IRQHandler(void)  里面了

因为数据长度也不大,我建议先把一帧的数据接收完毕后再取数出来处理,我感觉判断帧头的语句有点难懂呢
8#

我是小白ljj

发表于 2016-5-12 17:01:47 | 只看该作者

荣丰宇 发表于 2016-5-12 14:56
你程序的意思是:上位机将float转换为short,再打包发送AA等一串数据字节到板子上,板子接收取出来,重新 ...

程序的作用您理解的非常正确,不愧是大神。程序问题应该就处在中断函数上。这只是一个测试程序,实际上有很多数据。
判断帧头的语句可能自己水平有限写的不太好,大概意思就是只有检测到两个AA时才接收数据。我感觉我对  sbus_rx_buffer[rx_size]=USART_ReceiveData(USART2);   的理解有问题,USART_ReceiveData返回的值是AA还是AAA09170FA0E96,这一串数据呢?
另外调试时监测发现下列参数一直没变,USART2=0x40004400,USART_ReceiveData=0x0800188C, sbus_rx_buffer[rx_size]=0x0096,
是不是串口配置哪里出错了啊?
我对这段程序都快绝望了。。。。。
大神,拜托了
9#

yerun

发表于 2016-5-12 17:42:30 | 只看该作者

大神让你看波特率,循环测试,示波器量之类的
10#

hgqlyl

发表于 2016-5-12 18:11:57 | 只看该作者

1、USART_ReceiveData(USART2); 返回的是一个字节数据,也就是你说的0xAA,你的判断接收策略有点问题,我觉得逻辑有错。
2、另外调试时监测发现下列参数一直没变,USART2=0x40004400,USART_ReceiveData=0x0800188C,
这个数字只是该变量或者函数的地址信息,并不是该变量或者函数的返回值。
3、if(sbus_rx_buffer[rx_size]==0xAA)
   {
        b=1;
   }
   if((b==1)&&(sbus_rx_buffer[rx_size+1]==0xAA))
   {
        b=0;
        c=1;
   }
你这里当接收到0xAA后将b=1,接下来就判断sbus_rx_buffer[rx_size+1]==0xAA,你下一个数据都还没有接收,你怎么判断它等不等于1呢?这样的话你下面的接收数据程序不会执行,因为不可能为真。还有就是你在里面进行了多次自加,这个就有问题,进入一次中断只接收一个字节数据,你多次自加有什么意义呢?

请好好查查,程序逻辑都有问题,也许我理解得不对,不过请你他问的时候尽量描述仔细一点,内容归纳整齐一点,这样才有大神回答的。
   
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条