久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2181|回復: 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)
回復

使用道具 舉報

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

你好可以詳細說明一下嗎謝謝
回復

使用道具 舉報

ID:876099 發表于 2021-9-15 11:04 | 顯示全部樓層
sinside 發表于 2021-9-15 08:05
我猜你的問題是 電腦 發數據 給單片機, 單片機收到數據后 進行計算, 但是計算的結果不對?
由于不太清楚你 ...

這個我改了一下把數據類型改成uint 16_t還是不行,我輸入A1結果e的結果是49我現在也很懵
回復

使用道具 舉報

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的值哪一個有問題?

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

回復

使用道具 舉報

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;
}
}
回復

使用道具 舉報

ID:94031 發表于 2021-9-15 15:24 | 顯示全部樓層
你發“A100”是ASCII碼,還是16進制數值;先不要計算,先調試看發送,接收正常與否。
回復

使用道具 舉報

ID:876099 發表于 2021-9-15 17:12 | 顯示全部樓層
lkc8210 發表于 2021-9-15 14:18
應該用strrpos()才對
例:
char Result;

好的非常感謝已解決主要是我的是ascll碼沒有轉成數字所以導致錯誤
回復

使用道具 舉報

ID:876099 發表于 2021-9-15 17:12 | 顯示全部樓層
sinside 發表于 2021-9-15 13:05
首先, 假設你的通訊是對的(我沒有細看你的程序), 先只驗證下面的程序是否正確:
switch (len)
        {

謝謝我已經解決問題了是ascll的問題沒有轉換
回復

使用道具 舉報

ID:876099 發表于 2021-9-15 17:12 | 顯示全部樓層
xuyaqi 發表于 2021-9-15 15:24
你發“A100”是ASCII碼,還是16進制數值;先不要計算,先調試看發送,接收正常與否。

就是ascll的問題已經解決
回復

使用道具 舉報

ID:876099 發表于 2021-9-15 23:00 | 顯示全部樓層
ascll碼解決了,我把程序燒進去也ok了,但是就吃了個晚飯結果就接收不到數據了,這真的氣死我了
回復

使用道具 舉報

ID:876099 發表于 2021-9-15 23:40 | 顯示全部樓層
這個問題有大佬解決一下嗎這個我真不知道哪兒原因本來好好的結果一下不行了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本欧美国产 | 成人免费淫片aa视频免费 | 久久久久久久久国产精品 | 韩日精品一区 | 日韩一区欧美一区 | 日韩在线播放视频 | www.亚洲| 欧美成人高清 | 国产精品久久久久久福利一牛影视 | 老妇激情毛片免费 | 亚洲一区二区av | 午夜电影福利 | 亚洲一二三区不卡 | 97视频在线观看免费 | 亚洲成人免费 | 国产在线精品一区二区三区 | 亚洲国产精品久久久 | 激情小说综合网 | 精品自拍视频在线观看 | 人人爽人人草 | 成人精品一区二区 | 成人在线中文字幕 | 99精品免费久久久久久久久日本 | 成人av网页| 免费观看一级特黄欧美大片 | www.色综合 | 亚洲色图婷婷 | 亚洲网站在线观看 | 欧美福利精品 | 欧美一区二区三区在线播放 | 天天天天操 | 国产精品久久久久久久久大全 | 国产精品久久久久久久免费大片 | 无码日韩精品一区二区免费 | 日批免费观看 | 亚洲欧美一区二区三区1000 | 色偷偷人人澡人人爽人人模 | 日韩性在线 | 台湾a级理论片在线观看 | 麻豆av网站 | 国产成人午夜高潮毛片 |