#include<stdio.h>
#include"stm32f10x.h"
#include<stm32f10x_gpio.h>
#include<stm32f10x_conf.h>
int re[10]={1,0,0,0,0,0,0,0,0,0};
int count=0;
int main()
{ void My_usart1_init();
void send();
My_usart1_init();
send();
while(1);
return (1);
}
void My_usart1_init()
{
//1.将A设成输入模式
GPIO_InitTypeDef GPIO_STU2;
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_STU2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_STU2.GPIO_Mode=GPIO_Mode_AF_PP;//第9口为发送(输出)引脚,必设为推挽复用
GPIO_STU2.GPIO_Pin=GPIO_Pin_9;
GPIO_Init ( GPIOA, & GPIO_STU2 );
GPIO_STU2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_STU2.GPIO_Mode=GPIO_Mode_IN_FLOATING;//第10口为接收(输入)引脚,必设为浮空或者上拉
GPIO_STU2.GPIO_Pin=GPIO_Pin_10;
GPIO_Init ( GPIOA, & GPIO_STU2 );
//2.设置串口复用时钟
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_USART1, ENABLE );
//3.串口初始化
USART_InitTypeDef USA;
USA.USART_BaudRate=115200;
USA.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USA.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//双开
USA.USART_Parity=USART_Parity_No;
USA.USART_StopBits=USART_StopBits_1;
USA.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USA);
//4.使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//5.设置中断优先级(又是一波经典联动)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef PROVERTY;
PROVERTY.NVIC_IRQChannel=USART1_IRQn;//外联
PROVERTY.NVIC_IRQChannelCmd=ENABLE;//非冗余,开中断
PROVERTY.NVIC_IRQChannelPreemptionPriority=2;
PROVERTY.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&PROVERTY);
//6.打开串口使能
USART_Cmd(USART1,ENABLE);
}
void USART1_IRQHandler()
{
extern int re[];
extern int count;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE))//告诉是接收还是发送中断,虽然开了接发口,但是只开了接收中断
{re[count]=USART_ReceiveData(USART1);
count++;
}
}
void send()
{ int i=0;
for(i=0;i<10;i++)
USART_SendData(USART1,i);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==0);
}
/*这个代码按照道理应该能将re【】依照顺序10个数据,但是只有第一个能成功(证明串口初始化没问题),但是第二个开始就不对了,求指教如何才能完全传输正确?测试方法将A9口和A10口直接连接,然后检查re中的数据是否对*/
你不要用同一设备接收,换另一个设备接收。很有可能你的接收中断执行的时候打断了发送过程。至于第一个能正确发送是因为第一个发送的时候接收中断必然不被触发。当你发送第二个的时候,第一个接收中断触发,然后打断发送;发第三个的时候,第二个接收中断触发。。。。。以此类推
使用DMA
发送的数据量和数据格式不匹配,另外检查一下波特率是否正确。参考程序如下 :
HAL_StatusTypeDef UART_T(uint8_t *pData, uint16_t Size)
{
return(HAL_UART_Transmit(&huart1,pData,Size, 5000));
}
void UartSend(uint8_t*msg,uint8_t size) //直接发送数据
{
if(0!=size)
{
UART_T(msg,size);
}
}