stm32單片機USART發送數據給電腦的程序 如果解決全分贈送。


#include"stm32f10x.h"
u16 sheng[]={1,2,3,4,5,6,7,8,9};
int i=0;

void GPIO_Configuration()
    {
        GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //將pa9口設置
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOA, &GPIO_InitStructure);

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
       GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
void RCC_Configuration()
    {
       RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1|                                 RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1,ENABLE);//使能時鍾

    }
void NVIC_Configuration()
    {
  NVIC_InitTypeDef nvic_initstructure;
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//配置中斷優先級
      
      nvic_initstructure.NVIC_IRQChannel=USART1_IRQn;
      nvic_initstructure.NVIC_IRQChannelPreemptionPriority=NVIC_PriorityGroup_0;
      nvic_initstructure.NVIC_IRQChannelSubPriority=NVIC_PriorityGroup_4;
      nvic_initstructure.NVIC_IRQChannelCmd=ENABLE;//使能中斷相當於中斷的總開關
  NVIC_Init(&nvic_initstructure);
    }

void USART0_SendByte(u16 Data)
   { 
      while (!(USART1->SR & USART_FLAG_TXE)); 
      USART1->DR = (Data & (uint16_t)0x01FF); 
   }


//void USART_SendData(USART_TypeDef * USARTx, uint16_t Data)

int main(void)
   {
    // u16 temp;
     RCC_Configuration();
     GPIO_Configuration();
     USART_Configuration();
     USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//相當於中斷的分開關,串口開關
     NVIC_Configuration();
     USART_Cmd( USART1, ENABLE);
     
     while(1)
       {
         //USART0_SendByte(sheng[i]);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
         //while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
        }
void USART1_IRQHandler()
    {
      if(USART_GetITStatus( USART1, USART_IT_TXE)!=RESET)
       {
        USART0_SendByte(sheng[i]);
         i++;
         //USART_ClearFlag(USART0,USART_FLAG_TXE);
       }
    }
大神們看一下程序哪里有問題 實現的功能是網電腦上發送數據 電腦串口小助手接收區會顯示1,2,3,4,5,6,7,8,9.。。。。。現在顯示的是一堆亂碼和其他字符。

12 个解决方案

#1


問題可能出在

USART_IT_TXE

這幾個發送中斷標志的產生生條件,LZ可以看一下數據手冊里,好好歸納一下這類條件

再想想,中斷發送怎么處理比較合適

#2


    /* USART1 configured as follow:
        - BaudRate = 9600 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
    */
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx;

    /* Configure USART1 */
    USART_Init(USART1, &USART_InitStructure);

#3


中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
        USART0_SendByte(sheng[i]);
         i++;

應該改為
if(i < 9){
        USART0_SendByte(sheng[i]);
         i++;
}else{
        i = 0;
         USART0_SendByte(sheng[i]);
         i++;
}


波特率可能不對,有示波器可以測一測波形

#4


中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
        USART0_SendByte(sheng[i]);
         i++;

應該改為
if(i < 9){
        USART0_SendByte(sheng[i]);
         i++;
}else{
        i = 0;
         USART0_SendByte(sheng[i]);
         i++;
}


波特率可能不對,有示波器可以測一測波形

#5


中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
        USART0_SendByte(sheng[i]);
         i++;

應該改為
if(i < 9){
        USART0_SendByte(sheng[i]);
         i++;
}else{
        i = 0;
         USART0_SendByte(sheng[i]);
         i++;
}


波特率可能不對,有示波器可以測一測波形

#6


i首先不能夠大於9,遇到9就重新=0,確保buf不越界

#7


波特率不對
USART0_SendByte(sheng[i]);

#8


很明顯沒配置波特率啊USART_BaudRate沒有啊,你的串口初始化時的庫函數配置也沒有啊

#9


顯示的是一堆亂碼和其他字符。
這種問題都是波特率問題。

樓主是否是初次搞,波特率問題不是說你的波特率設置錯誤了,
比如你電腦是9600,stm32也是9600,也是可能收不到的。
這是因為,還有一個系統時鍾也要影響你的波特率。

樓主可以先跑其他測試成功的程序看看硬件連接上,確認沒有問題。

#10


引用 9 樓 zdx818 的回復:
顯示的是一堆亂碼和其他字符。
這種問題都是波特率問題。

樓主是否是初次搞,波特率問題不是說你的波特率設置錯誤了,
比如你電腦是9600,stm32也是9600,也是可能收不到的。
這是因為,還有一個系統時鍾也要影響你的波特率。

樓主可以先跑其他測試成功的程序看看硬件連接上,確認沒有問題。

請問系統時鍾具體是什么的時鍾,怎么影響波特率的?要怎么檢測或者修改?
謝謝

#11


樓主你的問題解決了嗎?我也遇到類似的問題,用數據線可以正常接收數據,但用無線模塊時接收出現亂碼,求賜教啊

#12


引用 5 樓 andy_wsj 的回復:
中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
        USART0_SendByte(sheng[i]);
         i++;

應該改為
if(i < 9){
        USART0_SendByte(sheng[i]);
         i++;
}else{
        i = 0;
         USART0_SendByte(sheng[i]);
         i++;
}


波特率可能不對,有示波器可以測一測波形

LS說的可能是對的,是不是波特率不對,或者初始化出問題了,串口時鍾是否打開了?引腳是否使用的串口功能?

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com