本人在弄一个小项目,用到了STM32F103C8T6,我想测试向usart发送一帧数据(数据结尾0x0d 0x0a),其中用到了usart3和usart2,代码是按照正点原子STM32F103ZE里面的串口实验写的。目前遇到的问题是:单独用usart3,在PC端发送数据usart3能够接收到正确的数据,单独用usart2也能收到正确的数据。但是我利用usart3接收数据、用usart2发送数据就会出现首字符消失的问题(有时候也会正常)。
void My_USART3_Init(void)
{
//需要使用到的结构体定义
GPIO_InitTypeDef GPIO_Initstruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
//USART_TX GPIOB_Pin_10
GPIO_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Initstruct.GPIO_Pin=GPIO_Pin_10;
GPIO_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_Initstruct);
//USART_RX GPIOB_Pin_11
GPIO_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Initstruct.GPIO_Pin=GPIO_Pin_11;
GPIO_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_Initstruct);
//UASART 初始化
USART_InitStruct.USART_BaudRate=57600;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART3,&USART_InitStruct);
//串口使能
USART_Cmd(USART3,ENABLE);
//打开接收中断
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
//中断优先级设置
NVIC_InitStruct.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStruct);
}
void USART3_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART3); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
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;//接收数据错误,重新开始接收
}
}
}
}
}
int main(void)
{
u16 t;
u16 len;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级组设置
My_USART2_Init();
My_USART3_Init();
RS485_Init();
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
for(t=0;t<len;t++)
{
USART_SendData(USART3, USART_RX_BUF[t]);//向串口3发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("
");//插入换行
USART_RX_STA=0;
}
}
}
这些是主要代码,现在不知道什么原因,求助
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
谢谢
赠人玫瑰,手有余香
一周热门 更多>