标题: 求助串口提取数据 [打印本页]

作者: 1045964948    时间: 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)



作者: lkc8210    时间: 2021-9-15 03:22
字串比较可用string.h内的strcmp函数 Keil.com

作者: sinside    时间: 2021-9-15 08:05
我猜你的问题是 电脑 发数据 给单片机, 单片机收到数据后 进行计算, 但是计算的结果不对?
由于不太清楚你的问题, 所以我看了一下你的代码, 你 检查一下是否符合以下两点:
1. a,b,c,d,e只有unsigned char 范围255, 你的乘法计算是否溢出了? 我看到有*10, *100的
2. 如果计算结果不正确, 有没有先检查,  接收的结果是否正确, 如果接收结果正确, 那就是计算问题, 如果不是那是接收问题.
作者: 1045964948    时间: 2021-9-15 10:00
lkc8210 发表于 2021-9-15 03:22
字串比较可用string.h内的strcmp函数 Keil.com

你好可以详细说明一下吗谢谢
作者: 1045964948    时间: 2021-9-15 11:04
sinside 发表于 2021-9-15 08:05
我猜你的问题是 电脑 发数据 给单片机, 单片机收到数据后 进行计算, 但是计算的结果不对?
由于不太清楚你 ...

这个我改了一下把数据类型改成uint 16_t还是不行,我输入A1结果e的结果是49我现在也很懵
作者: sinside    时间: 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的值哪一个有问题?

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


作者: lkc8210    时间: 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;
}
}

作者: xuyaqi    时间: 2021-9-15 15:24
你发“A100”是ASCII码,还是16进制数值;先不要计算,先调试看发送,接收正常与否。
作者: 1045964948    时间: 2021-9-15 17:12
lkc8210 发表于 2021-9-15 14:18
应该用strrpos()才对
例:
char Result;

好的非常感谢已解决主要是我的是ascll码没有转成数字所以导致错误
作者: 1045964948    时间: 2021-9-15 17:12
sinside 发表于 2021-9-15 13:05
首先, 假设你的通讯是对的(我没有细看你的程序), 先只验证下面的程序是否正确:
switch (len)
        {

谢谢我已经解决问题了是ascll的问题没有转换
作者: 1045964948    时间: 2021-9-15 17:12
xuyaqi 发表于 2021-9-15 15:24
你发“A100”是ASCII码,还是16进制数值;先不要计算,先调试看发送,接收正常与否。

就是ascll的问题已经解决
作者: 1045964948    时间: 2021-9-15 23:00
ascll码解决了,我把程序烧进去也ok了,但是就吃了个晚饭结果就接收不到数据了,这真的气死我了
作者: 1045964948    时间: 2021-9-15 23:40
这个问题有大佬解决一下吗这个我真不知道哪儿原因本来好好的结果一下不行了





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1