找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2310|回复: 12
打印 上一主题 下一主题
收起左侧

求助串口提取数据

[复制链接]
跳转到指定楼层
楼主
ID:876099 发表于 2021-9-15 01:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助一下帖子里面的大佬,我的目的是想用电脑向32发送一个例如A100这样的数据控制舵机,但是现在我能判断第一个数据,然后我在提取后面的数据的时候就出现了问题,例如我本来发送的是A1,但是我运算后的结果却不是1,熬夜一小时查资料无果后想到求助一下大佬,代码有点乱勿喷,
下面是代码,附件在最后,在这里感谢每一位帮助我的人
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "pwm.h"
  4. #include "usart.h"
  5. uint16_t i=0;
  6.          uint8_t t;
  7.         uint8_t len;        
  8.         uint16_t times=0;
  9. unsigned char a,b=0,c=0,d=0,e=0;


  10. int main()
  11. {

  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
  13.         
  14.         TIM3_CH1_PWM_Init(2000-1,720-1);
  15.         TIM3_CH2_PWM_Init(2000-1,720-1);  
  16.         TIM3_CH3_PWM_Init(2000-1,720-1);  
  17.         TIM3_CH4_PWM_Init(2000-1,720-1);  
  18.         uart_init(115200);
  19.         printf("\r\n welcome to ±±¾©\r\n");
  20.         
  21.         while(1)
  22.         {        
  23.                    if(USART_RX_STA&0x8000)
  24.                 {                                          
  25.                         len=USART_RX_STA&0x3fff;
  26.                         printf("\r\nÄú·¢ËíμÄÏûÏ¢Îa:\r\n\r\n");
  27.                         for(t=0;t<len;t++)
  28.                         {
  29.                                 USART_SendData(USART1, USART_RX_BUF[t]);
  30.                                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
  31.                         }
  32.                         printf("\r\n\r\n");//2åèë»»DD
  33.                         USART_RX_STA=0;

  34.                         
  35.                 }
  36.                                 b= USART_RX_BUF[1];
  37.                     c= USART_RX_BUF[2];
  38.                     d= USART_RX_BUF[3];
  39.                
  40.   switch (len)
  41.         {
  42.                 case 2:e=b;b=0; break;
  43.                 case 3:e=b*10+c;break;
  44.                 case 4:e=b*100+c*10+d;break;
  45.         }
  46. //         printf("%d",e);
  47. //        printf("\r\n\r\n");//2åèë»»DD


  48.         
  49.         switch (USART_RX_BUF[0])
  50.         {
  51.                 case 65:TIM_SetCompare1(TIM3,e); break;
  52. //                case 66:TIM_SetCompare1(TIM3,e); break;
  53. //                case 67:TIM_SetCompare1(TIM3,e); break;
  54. //                case 68:TIM_SetCompare1(TIM3,e); break;

  55.         }

  56.         }
  57. }
复制代码
STM32F103RCT6例.7z (184.21 KB, 下载次数: 6)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2021-9-15 03:22 | 只看该作者
字串比较可用string.h内的strcmp函数 Keil.com
回复

使用道具 举报

板凳
ID:935919 发表于 2021-9-15 08:05 | 只看该作者
我猜你的问题是 电脑 发数据 给单片机, 单片机收到数据后 进行计算, 但是计算的结果不对?
由于不太清楚你的问题, 所以我看了一下你的代码, 你 检查一下是否符合以下两点:
1. a,b,c,d,e只有unsigned char 范围255, 你的乘法计算是否溢出了? 我看到有*10, *100的
2. 如果计算结果不正确, 有没有先检查,  接收的结果是否正确, 如果接收结果正确, 那就是计算问题, 如果不是那是接收问题.
回复

使用道具 举报

地板
ID:876099 发表于 2021-9-15 10:00 | 只看该作者
lkc8210 发表于 2021-9-15 03:22
字串比较可用string.h内的strcmp函数 Keil.com

你好可以详细说明一下吗谢谢
回复

使用道具 举报

5#
ID:876099 发表于 2021-9-15 11:04 | 只看该作者
sinside 发表于 2021-9-15 08:05
我猜你的问题是 电脑 发数据 给单片机, 单片机收到数据后 进行计算, 但是计算的结果不对?
由于不太清楚你 ...

这个我改了一下把数据类型改成uint 16_t还是不行,我输入A1结果e的结果是49我现在也很懵
回复

使用道具 举报

6#
ID:935919 发表于 2021-9-15 13:05 | 只看该作者
本帖最后由 sinside 于 2021-9-15 13:08 编辑

首先, 假设你的通讯是对的(我没有细看你的程序), 先只验证下面的程序是否正确:
switch (len)
        {
                case 2:e=b;b=0; break;
                case 3:e=b*10+c;break;
                case 4:e=b*100+c*10+d;break;
        }

假设你的输入(设置断点或者单独把这段程序直接执行) 在进程序前 把b的值设置成0xA1, len分别设置成 2, 3, 4, c = 0, d = 0, 看看len=2的时候e计算是否正确, len=3的时候e的计算是否正确, len=4的时候是否正确.

如果都正确, 那么你原来不正确, 是否是有什么条件与上面的设置不一样? 才导致结果不正确?

再逐一排查是否是变量的类型问题, 还是b的值问题, 还是c的值问题, 还是e, len的值哪一个有问题?

上面说的只是一种调试的方法, 不知道我是不是说清楚了? (就是你的计算就放在哪里, 进计算前, 所有的条件都定了, 看看结果是不是你预料的, 如果不是就逐一排查各种条件)

回复

使用道具 举报

7#
ID:161164 发表于 2021-9-15 14:18 | 只看该作者
1045964948 发表于 2021-9-15 10:00
你好可以详细说明一下吗谢谢

应该用strrpos()才对
例:
char Result;
int Convert_Val;
Result = strrpos(USART_RX_BUF,'A');//找A的位置
if(Result != -1)
{char j;
for(j = 0;j < len;j++)
{
Convert_Val*=10;
Convert_Val+=USART_RX_BUF[Result + 1 + j] - '0';//把A后面的数字字符转换成数值,因为串口传输的是ASCII字符值: '0' = 48, '1' = 49;
}
}
回复

使用道具 举报

8#
ID:94031 发表于 2021-9-15 15:24 | 只看该作者
你发“A100”是ASCII码,还是16进制数值;先不要计算,先调试看发送,接收正常与否。
回复

使用道具 举报

9#
ID:876099 发表于 2021-9-15 17:12 | 只看该作者
lkc8210 发表于 2021-9-15 14:18
应该用strrpos()才对
例:
char Result;

好的非常感谢已解决主要是我的是ascll码没有转成数字所以导致错误
回复

使用道具 举报

10#
ID:876099 发表于 2021-9-15 17:12 | 只看该作者
sinside 发表于 2021-9-15 13:05
首先, 假设你的通讯是对的(我没有细看你的程序), 先只验证下面的程序是否正确:
switch (len)
        {

谢谢我已经解决问题了是ascll的问题没有转换
回复

使用道具 举报

11#
ID:876099 发表于 2021-9-15 17:12 | 只看该作者
xuyaqi 发表于 2021-9-15 15:24
你发“A100”是ASCII码,还是16进制数值;先不要计算,先调试看发送,接收正常与否。

就是ascll的问题已经解决
回复

使用道具 举报

12#
ID:876099 发表于 2021-9-15 23:00 | 只看该作者
ascll码解决了,我把程序烧进去也ok了,但是就吃了个晚饭结果就接收不到数据了,这真的气死我了
回复

使用道具 举报

13#
ID:876099 发表于 2021-9-15 23:40 | 只看该作者
这个问题有大佬解决一下吗这个我真不知道哪儿原因本来好好的结果一下不行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表