本帖最后由 z755924843 于 2013-7-30 08:22 编辑
如题 小弟弄了好几天了 上网找了好多资料,最后还是没有办法 ,只能求助论坛里的各位大侠了。
我用的是STM32f101,两片STM32利用USART2进行通信,发送函数只是简单的sendchar()
USART2配置函数如下
void USART2_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;//①定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
/* USARTx configured as follow:
- BaudRate = 4800 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 = 4800; /*设置波特率为4800*/
USART_InitStructure.USART_WordLength = USART_WordLength_8b; /*设置数据位为8
位*/
USART_InitStructure.USART_StopBits = USART_StopBits_1; /*设置停止位为1位*/
USART_InitStructure.USART_Parity = USART_Parity_No; /*无奇偶校验*/
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /*没有硬件流控*/
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/*发送与接收*/
/*完成串口的时钟配置、GPIO配置,根据上述参数初始化并使能*/
/******************************************************************************
****/
/******************************************************************************
****/
/*③使能时钟RX,TX,USART2*/
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//USART1-GPIO_Pin_9,GPIO_Pin_10
/* Enable UART clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//USART1
/*④配置USART的GPIO,GPIOA_2 = Tx,GPIOA_3 = Rx*/
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/*⑤USART初始化*/
/* USART configuration */
USART_Init(USART2, &USART_InitStructure);
/*⑥USART使能*/
/* Enable USART */
USART_Cmd(USART2, ENABLE);
/*使能串口接收中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
发送函数如下
void USART2_SendChar(u8 data)
{
USART_ClearFlag(USART2,USART_FLAG_TC);//看网上有人说发送时限清TC 否则会丢第一个字节
USART_SendData(USART2,(u8)data);//发送数据
while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);//判断是否发送完成
USART_ClearFlag(USART2,USART_FLAG_TC);//清除标志
}
以上就是发送函数。
接收数据我使用的是中断接收模式
void USART2_IRQHandler(void)
{
//处理接收到的数据
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)//判断是否存在溢出错误
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //清溢出位
USART_ReceiveData(USART1); //读DR
usart2_idx = 0; //清除计数
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收完成
{
//Clear the USART1 Receive interrupt
usart2_frame_buff[usart2_idx++] = USART_ReceiveData(USART2); //接收数据
USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
if(usart2_idx == 4){//接收为5个字节则重新接收
usart2_idx = 0;
}
}
}
问题是我现在在主机上使用发送数据:
u8 USART2_Senddata(void)
{
u8 i ;
USART2_SendChar(100);
for(i = 0;i<0xff;i++);
USART2_SendChar(101);
for(i = 0;i<0xff;i++);
USART2_SendChar(102);
for(i = 0;i<0xff;i++);
USART2_SendChar(103);
for(i = 0;i<0xff;i++);
USART2_SendChar(104);
for(i = 0;i<0xff;i++);
return 1;
}
但是不能正确接收 下面是我用串口调试助手打印出来的接收信息:
希望坛子里的高手帮忙解答 小弟感激不尽了 。
|