找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2235|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

求助串口提取數(shù)據(jù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:876099 發(fā)表于 2021-9-15 01:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
求助一下帖子里面的大佬,我的目的是想用電腦向32發(fā)送一個(gè)例如A100這樣的數(shù)據(jù)控制舵機(jī),但是現(xiàn)在我能判斷第一個(gè)數(shù)據(jù),然后我在提取后面的數(shù)據(jù)的時(shí)候就出現(xiàn)了問(wèn)題,例如我本來(lái)發(fā)送的是A1,但是我運(yùn)算后的結(jié)果卻不是1,熬夜一小時(shí)查資料無(wú)果后想到求助一下大佬,代碼有點(diǎn)亂勿噴,
下面是代碼,附件在最后,在這里感謝每一位幫助我的人
  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. }
復(fù)制代碼
STM32F103RCT6例.7z (184.21 KB, 下載次數(shù): 6)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

12#
ID:876099 發(fā)表于 2021-9-15 23:40 | 只看該作者
這個(gè)問(wèn)題有大佬解決一下嗎這個(gè)我真不知道哪兒原因本來(lái)好好的結(jié)果一下不行了
回復(fù)

使用道具 舉報(bào)

11#
ID:876099 發(fā)表于 2021-9-15 23:00 | 只看該作者
ascll碼解決了,我把程序燒進(jìn)去也ok了,但是就吃了個(gè)晚飯結(jié)果就接收不到數(shù)據(jù)了,這真的氣死我了
回復(fù)

使用道具 舉報(bào)

10#
ID:876099 發(fā)表于 2021-9-15 17:12 | 只看該作者
xuyaqi 發(fā)表于 2021-9-15 15:24
你發(fā)“A100”是ASCII碼,還是16進(jìn)制數(shù)值;先不要計(jì)算,先調(diào)試看發(fā)送,接收正常與否。

就是ascll的問(wèn)題已經(jīng)解決
回復(fù)

使用道具 舉報(bào)

9#
ID:876099 發(fā)表于 2021-9-15 17:12 | 只看該作者
sinside 發(fā)表于 2021-9-15 13:05
首先, 假設(shè)你的通訊是對(duì)的(我沒(méi)有細(xì)看你的程序), 先只驗(yàn)證下面的程序是否正確:
switch (len)
        {

謝謝我已經(jīng)解決問(wèn)題了是ascll的問(wèn)題沒(méi)有轉(zhuǎn)換
回復(fù)

使用道具 舉報(bào)

8#
ID:876099 發(fā)表于 2021-9-15 17:12 | 只看該作者
lkc8210 發(fā)表于 2021-9-15 14:18
應(yīng)該用strrpos()才對(duì)
例:
char Result;

好的非常感謝已解決主要是我的是ascll碼沒(méi)有轉(zhuǎn)成數(shù)字所以導(dǎo)致錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

7#
ID:94031 發(fā)表于 2021-9-15 15:24 | 只看該作者
你發(fā)“A100”是ASCII碼,還是16進(jìn)制數(shù)值;先不要計(jì)算,先調(diào)試看發(fā)送,接收正常與否。
回復(fù)

使用道具 舉報(bào)

6#
ID:161164 發(fā)表于 2021-9-15 14:18 | 只看該作者
1045964948 發(fā)表于 2021-9-15 10:00
你好可以詳細(xì)說(shuō)明一下嗎謝謝

應(yīng)該用strrpos()才對(duì)
例:
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后面的數(shù)字字符轉(zhuǎn)換成數(shù)值,因?yàn)榇趥鬏數(shù)氖茿SCII字符值: '0' = 48, '1' = 49;
}
}
回復(fù)

使用道具 舉報(bào)

5#
ID:935919 發(fā)表于 2021-9-15 13:05 | 只看該作者
本帖最后由 sinside 于 2021-9-15 13:08 編輯

首先, 假設(shè)你的通訊是對(duì)的(我沒(méi)有細(xì)看你的程序), 先只驗(yàn)證下面的程序是否正確:
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;
        }

假設(shè)你的輸入(設(shè)置斷點(diǎn)或者單獨(dú)把這段程序直接執(zhí)行) 在進(jìn)程序前 把b的值設(shè)置成0xA1, len分別設(shè)置成 2, 3, 4, c = 0, d = 0, 看看len=2的時(shí)候e計(jì)算是否正確, len=3的時(shí)候e的計(jì)算是否正確, len=4的時(shí)候是否正確.

如果都正確, 那么你原來(lái)不正確, 是否是有什么條件與上面的設(shè)置不一樣? 才導(dǎo)致結(jié)果不正確?

再逐一排查是否是變量的類(lèi)型問(wèn)題, 還是b的值問(wèn)題, 還是c的值問(wèn)題, 還是e, len的值哪一個(gè)有問(wèn)題?

上面說(shuō)的只是一種調(diào)試的方法, 不知道我是不是說(shuō)清楚了? (就是你的計(jì)算就放在哪里, 進(jìn)計(jì)算前, 所有的條件都定了, 看看結(jié)果是不是你預(yù)料的, 如果不是就逐一排查各種條件)

回復(fù)

使用道具 舉報(bào)

地板
ID:876099 發(fā)表于 2021-9-15 11:04 | 只看該作者
sinside 發(fā)表于 2021-9-15 08:05
我猜你的問(wèn)題是 電腦 發(fā)數(shù)據(jù) 給單片機(jī), 單片機(jī)收到數(shù)據(jù)后 進(jìn)行計(jì)算, 但是計(jì)算的結(jié)果不對(duì)?
由于不太清楚你 ...

這個(gè)我改了一下把數(shù)據(jù)類(lèi)型改成uint 16_t還是不行,我輸入A1結(jié)果e的結(jié)果是49我現(xiàn)在也很懵
回復(fù)

使用道具 舉報(bào)

板凳
ID:876099 發(fā)表于 2021-9-15 10:00 | 只看該作者
lkc8210 發(fā)表于 2021-9-15 03:22
字串比較可用string.h內(nèi)的strcmp函數(shù) Keil.com

你好可以詳細(xì)說(shuō)明一下嗎謝謝
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:935919 發(fā)表于 2021-9-15 08:05 | 只看該作者
我猜你的問(wèn)題是 電腦 發(fā)數(shù)據(jù) 給單片機(jī), 單片機(jī)收到數(shù)據(jù)后 進(jìn)行計(jì)算, 但是計(jì)算的結(jié)果不對(duì)?
由于不太清楚你的問(wèn)題, 所以我看了一下你的代碼, 你 檢查一下是否符合以下兩點(diǎn):
1. a,b,c,d,e只有unsigned char 范圍255, 你的乘法計(jì)算是否溢出了? 我看到有*10, *100的
2. 如果計(jì)算結(jié)果不正確, 有沒(méi)有先檢查,  接收的結(jié)果是否正確, 如果接收結(jié)果正確, 那就是計(jì)算問(wèn)題, 如果不是那是接收問(wèn)題.
回復(fù)

使用道具 舉報(bào)

樓主
ID:161164 發(fā)表于 2021-9-15 03:22 | 只看該作者
字串比較可用string.h內(nèi)的strcmp函數(shù) Keil.com
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表