找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32單片機(jī)串口通信協(xié)議程序調(diào)試問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:424805 發(fā)表于 2019-3-24 02:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我用的是stm32f103rc,我用我的代碼調(diào)試了倆三天都不行求各位大哥給我一個(gè)列子好不好
通信協(xié)議如下,我用的是串口四。

你們看一看我的單片機(jī)程序吧!
   u16 k=0;
   u8  gg[1];

  1. void Tongxin(void)//串口初始化
  2. {
  3. GPIO_InitTypeDef   GPIO_tongxin;
  4. USART_InitTypeDef  USART_tongxin;
  5. NVIC_InitTypeDef   NVIC_tongxin;

  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
  7. RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
  8. USART_DeInit(UART4);

  9. GPIO_tongxin.GPIO_Mode=GPIO_Mode_AF_PP ;
  10. GPIO_tongxin.GPIO_Pin=GPIO_Pin_10;
  11. GPIO_tongxin.GPIO_Speed=GPIO_Speed_50MHz;
  12. GPIO_Init(GPIOC,&GPIO_tongxin);

  13.     GPIO_tongxin.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  14. GPIO_tongxin.GPIO_Pin=GPIO_Pin_11;
  15. GPIO_tongxin.GPIO_Speed=GPIO_Speed_50MHz;
  16. GPIO_Init(GPIOC,&GPIO_tongxin);

  17. USART_tongxin.USART_BaudRate=115200;
  18. USART_tongxin.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  19. USART_tongxin.USART_Mode=USART_Mode_Rx |USART_Mode_Tx ;
  20. USART_tongxin.USART_Parity=USART_Parity_No;
  21. USART_tongxin.USART_StopBits=USART_StopBits_1;
  22. USART_tongxin.USART_WordLength=USART_WordLength_8b;
  23. USART_Init(UART4,&USART_tongxin);

  24. USART_Cmd(UART4,ENABLE);
  25. USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
  26. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  27. NVIC_tongxin.NVIC_IRQChannel=UART4_IRQn;
  28. NVIC_tongxin.NVIC_IRQChannelCmd=ENABLE;
  29. NVIC_tongxin.NVIC_IRQChannelPreemptionPriority=3;
  30. NVIC_tongxin.NVIC_IRQChannelSubPriority=3;
  31. NVIC_Init(&NVIC_tongxin);
  32. }

  33. void  UART4_IRQHandler(void)//串口4中斷服務(wù)函數(shù)
  34. {
  35.     u8 a,b=0,c=0;
  36. if((USART_GetITStatus(UART4,USART_IT_RXNE))!=RESET)//判斷中斷
  37. {
  38.   
  39.   do{
  40.      if(a==0x0d)  b=1; //判斷數(shù)據(jù)是否以0x0d結(jié)束
  41.   a=USART_ReceiveData(UART4);//接收數(shù)據(jù)
  42.   gg[k]=a;
  43.   k++;
  44.   }while(b==0);
  45.   for(b=0;b<k;b++)
  46.   {
  47.   USART_SendData(UART4,gg[b]);//發(fā)送數(shù)據(jù)
  48.   }
  49.   k=0;
  50. }
  51. }
復(fù)制代碼

我對這個(gè)簡單協(xié)議深感無力,改了好幾天了,一直在調(diào),求各位大佬給我一個(gè)列子研究一下。

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

使用道具 舉報(bào)

沙發(fā)
ID:94031 發(fā)表于 2019-3-24 08:41 | 只看該作者
你的串口中斷程序有問題,給你個(gè)參考程序。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
{
        Res =USART_ReceiveData(USART1);        //讀取接收到的數(shù)據(jù)
       
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
                if(USART_RX_STA&0x4000)//接收到了0x0d
                {
                        if(Res!=0x0a)USART_RX_STA=0;//接收錯(cuò)誤,重新開始
                        else USART_RX_STA|=0x8000;        //接收完成了
                }
                else //還沒收到0X0D
                {       
                        if(Res==0x0d)USART_RX_STA|=0x4000;
                        else
                        {
                                USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                USART_RX_STA++;
                                if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數(shù)據(jù)錯(cuò)誤,重新開始接收          
                        }                 
                }
        }                    
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:424805 發(fā)表于 2019-3-24 10:48 | 只看該作者
xuyaqi 發(fā)表于 2019-3-24 08:41
你的串口中斷程序有問題,給你個(gè)參考程序。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  // ...

這個(gè)程序我看了,我老師說這個(gè)中斷發(fā)送倆個(gè)數(shù)據(jù)可以,因?yàn)樗挠玫氖莍f語句判斷,只能接收一次,如果要接收多個(gè)數(shù)據(jù)需要什么循環(huán)什么東東,我不是很清楚!大佬能不能給我一個(gè)簡單一點(diǎn)的列子,就在中斷函數(shù)里面寫,不要用printf打印輸出
回復(fù)

使用道具 舉報(bào)

地板
ID:94031 發(fā)表于 2019-3-24 11:29 | 只看該作者
zeroL 發(fā)表于 2019-3-24 10:48
這個(gè)程序我看了,我老師說這個(gè)中斷發(fā)送倆個(gè)數(shù)據(jù)可以,因?yàn)樗挠玫氖莍f語句判斷,只能接收一次,如果要接 ...

你要把老師的要求說清楚,你把整個(gè)工程發(fā)出來別人才好判斷問題在哪。
回復(fù)

使用道具 舉報(bào)

5#
ID:424805 發(fā)表于 2019-3-24 12:45 | 只看該作者
xuyaqi 發(fā)表于 2019-3-24 11:29
你要把老師的要求說清楚,你把整個(gè)工程發(fā)出來別人才好判斷問題在哪。

我串口初始化好了,中斷處理根據(jù)通信協(xié)議我寫不來,你寫一個(gè)簡單的程序,好不好!就根據(jù)那個(gè)協(xié)議寫一個(gè)串口中斷函數(shù)
回復(fù)

使用道具 舉報(bào)

6#
ID:94031 發(fā)表于 2019-3-24 14:09 | 只看該作者
zeroL 發(fā)表于 2019-3-24 12:45
我串口初始化好了,中斷處理根據(jù)通信協(xié)議我寫不來,你寫一個(gè)簡單的程序,好不好!就根據(jù)那個(gè)協(xié)議寫一個(gè)串 ...

最好把工程發(fā)出來
回復(fù)

使用道具 舉報(bào)

7#
ID:424805 發(fā)表于 2019-3-25 00:27 | 只看該作者
2.7z (178.29 KB, 下載次數(shù): 14)

回復(fù)

使用道具 舉報(bào)

8#
ID:424805 發(fā)表于 2019-3-25 00:27 | 只看該作者
xuyaqi 發(fā)表于 2019-3-24 14:09
最好把工程發(fā)出來

發(fā)來了
回復(fù)

使用道具 舉報(bào)

9#
ID:497656 發(fā)表于 2019-3-25 11:24 | 只看該作者
下載了你此程序調(diào)試一下,把你的程序修改如下就可以了,希望對你有幫助
        void  UART4_IRQHandler(void)
{
    u8 a,b=0,c=0;
        if((USART_GetITStatus(UART4,USART_IT_RXNE))!=RESET)//ÅD¶ÏÖD¶Ï
        {
               
//                do{
                a=USART_ReceiveData(UART4);
                if(a==0x0d)  b=1;
                gg[k]=a;
                k++;       
//                }while(b==0);
               
                if(b==1)
                {
                        for(b=0;b<k;b++)
                        {
                                USART_SendData(UART4,gg[b]);//·¢Ëíêy¾Y
                                delay_us(1000);
                        }
                        k=0;                       
                }

  }
}
回復(fù)

使用道具 舉報(bào)

10#
ID:497656 發(fā)表于 2019-3-25 11:27 | 只看該作者


查看了你的工程,修改如下就可以了,希望對你有幫助。
void  UART4_IRQHandler(void)
{
    u8 a,b=0,c=0;
        if((USART_GetITStatus(UART4,USART_IT_RXNE))!=RESET)
        {
               
//                do{
                a=USART_ReceiveData(UART4);
                if(a==0x0d)  b=1;
                gg[k]=a;
                k++;       
//                }while(b==0);
               
                if(b==1)
                {
                        for(b=0;b<k;b++)
                        {
                                USART_SendData(UART4,gg);//·¢Ëíêy¾Y
                                delay_us(1000);
                        }
                        k=0;                       
                }

  }
}
回復(fù)

使用道具 舉報(bào)

11#
ID:94031 發(fā)表于 2019-3-25 17:18

f103ze串口4-9600-收什么發(fā)什么-成功.rar (4.51 MB, 下載次數(shù): 1) 在你發(fā)的工程基礎(chǔ)上做了修改,實(shí)現(xiàn)了收什么發(fā)什么,注意是9600波特率,stm32f103ze cpu,我只能在此cpu上試。供參考。

12#
ID:424805 發(fā)表于 2019-3-25 17:34 | 只看該作者
wtmkimmy 發(fā)表于 2019-3-25 11:27
查看了你的工程,修改如下就可以了,希望對你有幫助。
void  UART4_IRQHandler(void)
{

我現(xiàn)在加了判斷0x0a;串口就輸出不了了,我改變數(shù)組的大小,但輸出不會(huì)改變;列如:我把gg【k】自定義成倆位,輸入12345,該輸出12,但是程序輸出12345;大佬為什么?
void  UART4_IRQHandler(void)
{
    u8 a,b=0,c=0;
        if((USART_GetITStatus(UART4,USART_IT_RXNE))!=RESET)
        {
               
//                do{
                a=USART_ReceiveData(UART4);
    // if(a==0x0a)  c=1;
                if(a==0x0d)  b=1;
                gg[k]=a;
                k++;        
//                }while(b==0);
//                if(b==1&&a==1)
                if(b==1)
                {
                        for(b=0;b<k;b++)
                        {
                                USART_SendData(UART4,gg);
                                delay_us(1000);
                        }
                        k=0;      
                }
  }
}

回復(fù)

使用道具 舉報(bào)

13#
ID:424805 發(fā)表于 2019-3-26 23:11 | 只看該作者
哪位大佬,誰能根據(jù)通信協(xié)議寫一個(gè)串口4的出來?幫幫我!
回復(fù)

使用道具 舉報(bào)

14#
ID:424805 發(fā)表于 2019-3-28 16:00 | 只看該作者
有沒有懂得啊!
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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