stm32双机通信
今天调了一个stm32的双机通讯程序
stm32407和103之间的通信,拿原子大佬的代码改的。
这里贴一下收发的主程序:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "hc05.h"
#include "usart2.h"
#include "string.h"
#include "key.h"
//ALIENTEKminiSTM32开发板扩展实验
//ATK-HC05蓝牙串口模块实验-库函数版本
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
//ALIENTEK战舰STM32开发板实验13
//TFTLCD显示实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
void sendstr(char* s)
{
USART_ClearFlag(USART2, USART_FLAG_TC);
while(*s!='\0')
{
USART2->DR= *s;
while((USART2->SR&0X40)==0){}//等待发送完成
s++;
}
}
void sendnum(u8 a)
{
char* abuf;
sprintf(abuf,"%d",a);
sendstr(abuf);
}
int main(void)
{
u8 x=20,i;
u8 t;
u8 len;
char sbuf[]={"control"};
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
USART2_Init(115200);
POINT_COLOR=RED;
while(1)
{
sendnum(123);
delay_ms(1000);
if(USART2_RX_STA&0x8000)//接收程序
{
x=20;
i=0;
len=USART2_RX_STA&0x3fff;//得到此次接收到的数据长度
while(len--)
{
LCD_ShowChar(x,200, USART2_RX_BUF[i],16,1);
i=i+1;
x+=8;
}
USART2_RX_STA=0;
}
}
}
及以下重要的串口中断代码
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);
if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据 不等于0x80
{
if(USART_ReceiveData(USART2)!='\0'&&USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据
{
TIM_SetCounter(TIM4,0);//计数器清空
if(USART2_RX_STA==0)
TIM4_Set(1); //使能定时器4的中断
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}else USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
}
收和发单片机的主程序差不多,只不过用的串口和定时器有一些区别。
我使用的HC05,在连上单片机之前你要用一个USB转TTL模块的东西设置它的波特率,密码,绑定的地址,主从模式等等,这个很简单的,网上也找的到资料,你的蓝牙上电后就会自动联上相应的地址。这样你只要在程序中写简单的串口程序读写即可。
我的方法蓝牙连上单片机只需要四根线,每个蓝牙可以收也可以发