学习总线时曾经要求实现RS485通信,恰好跟前有两块带RS485的stm32开发板于是就简单实现了下。
先说下实现的功能,一块STM32F103板和STM32F407板通过RS485总线连接,F103板子采集温度发给F407屏幕显示出来,F407能够控制F103板子上的流水灯开关,然后F103能够将灯的实时状态发给F407显示,以此来实现双向通信。
下面直接贴关键代码
F103 main.c
double temp;
char isget;
char buf[8]; //接收缓存
char tbuf[8]; //发送缓存
void send(void);
int main()
{
int led=0;
int ttbuf;
LED_Init(); //初始化LED
rs485_init(); //初始化RS485配置
ds18b20_init(); //DS18B20初始化
isget=0;
tbuf[0]='S'; //起始帧
tbuf[1]=0x00; //地址
tbuf[2]=0x02; //命令
tbuf[7]='E'; //结束帧
GPIOC->ODR|=0x0080;
while(1)
{
if(isget)
{
isget=0;
if(buf[1]==0x01) //判断是该机地址
{
if(buf[2]==0x0A) //判断温度信号命令
{
temp=readtemp(); //读取温度
ttbuf=1000*temp; //温度去小数
tbuf[2]=0x02; //发送温度命令
//以下将 int型温度拆分成字节发送
tbuf[3]=ttbuf&0x000000ff;
tbuf[4]=(ttbuf>>8)&0x000000ff;
tbuf[5]=(ttbuf>>16)&0x000000ff;
tbuf[6]=(ttbuf>>24)&0x000000ff;
led_huayang(led<<7); //led信号灯
send(); //发送
}else if(buf[2]==0x0b) //判断控制信号
{
led_huayang(led<<7);
if(led==0)
{
GPIOC->ODR|=0x0080;
led=1;
}else{
GPIOC->ODR&=0xff7f;
led=0;
}
tbuf[2]=0x03; //返回信号
tbuf[3]=led; //返回灯的状态
send(); //发送灯的状态
}
}
}
}
}
int state=0,len=