#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 个解决方案
問題可能出在
USART_IT_TXE
這幾個發送中斷標志的產生生條件,LZ可以看一下數據手冊里,好好歸納一下這類條件
再想想,中斷發送怎么處理比較合適
中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
USART0_SendByte(sheng[i]);
i++;
應該改為
if(i < 9){
USART0_SendByte(sheng[i]);
i++;
}else{
i = 0;
USART0_SendByte(sheng[i]);
i++;
}
波特率可能不對,有示波器可以測一測波形
中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
USART0_SendByte(sheng[i]);
i++;
應該改為
if(i < 9){
USART0_SendByte(sheng[i]);
i++;
}else{
i = 0;
USART0_SendByte(sheng[i]);
i++;
}
波特率可能不對,有示波器可以測一測波形
中斷里面的
i++
可能導致數組越界
發送的東西不一定是你設置的數據
USART0_SendByte(sheng[i]);
i++;
應該改為
if(i < 9){
USART0_SendByte(sheng[i]);
i++;
}else{
i = 0;
USART0_SendByte(sheng[i]);
i++;
}
波特率可能不對,有示波器可以測一測波形
i首先不能夠大於9,遇到9就重新=0,確保buf不越界
波特率不對
USART0_SendByte(sheng[i]);
很明顯沒配置波特率啊USART_BaudRate沒有啊,你的串口初始化時的庫函數配置也沒有啊
顯示的是一堆亂碼和其他字符。
這種問題都是波特率問題。
樓主是否是初次搞,波特率問題不是說你的波特率設置錯誤了,
比如你電腦是9600,stm32也是9600,也是可能收不到的。
這是因為,還有一個系統時鍾也要影響你的波特率。
樓主可以先跑其他測試成功的程序看看硬件連接上,確認沒有問題。
樓主你的問題解決了嗎?我也遇到類似的問題,用數據線可以正常接收數據,但用無線模塊時接收出現亂碼,求賜教啊