4.本次试验的代码:
main函数:int main(void)
{
/* Configure the system clocks */
RCC_Configuration();
/* NVIC Configuration */
NVIC_Configuration();
/* Configure the GPIOs */
GPIO_Configuration();
/* Configure the USART1 */
USART_Configuration();
GPIO_SetBits(GPIOA, GPIO_Pin_8); //PA8是sp3485发送/接收控制端,这里先设置为发送(实现的功能就是上电之后STM32先向PC发送一个4和一个3)
delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧
USART_ClearFlag(USART1,USART_FLAG_TC);//这一句很关键,如果没有这一句这个4会发送不成功或者发送错误的,
//其实手册上讲了使能发送位后会发送一个无用的帧,所以那个帧发送完了这个
//发送完成的标志位USART_FLAG_TC当然也被置位了。
USART_SendData(USART1, 4);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//上面清除了发送完成标志位,那么这里就可以等待发送完成标志位被置位来判断这一帧是否发完了
USART_SendData(USART1, 3);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_8);//现在把PA8清零,试试接收PC机发送过来的数据
delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧
USART_ClearFlag(USART1,USART_FLAG_RXNE);//既然上面开始发送之前都将发送完成标志位清零,这里也将接收完成标志位清下零,就当是一个好习惯吧
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)//判断是否有一帧数据接收完成
{
buf[j++] = USART_ReceiveData(USART1); //接收完成的话就直接放到缓存区域里
}
if(10 == j)//接收完成10个之后就跳出去,不再接收了,有个意思就OK了
break;
}
j = 0;//清零一下j变量,使得实验可以反复接收PC发过来的10个数据
GPIO_SetBits(GPIOA, GPIO_Pin_8);//将sp3485设置为发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧
for(i = 0; i < 10; i++)
{
USART_SendData(USART1, buf[i]);//将数据依次发送出去
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
}
}
|