注:设备接收指令结束符为”0XFF 0XFF 0XFF”三个字节(HEX数据,不是字符串数据)。
适用于STM32F103系列的串口1,编写串口协议。
usart1.c
#include "usart1.h"
float everything =0;
//接收缓存
u8 reccmd_temp1[command_length1] ;
//接收标志
u8 rec_flag1 = 0;
u8 flag_temp=0;
u8 flag_first=0;
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
void USART1_Int(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;
USART_InitStructure.USART_BaudRate = 115200; //波特率;
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; //收发模式;
USART_Init(USART1, &USART_InitStructure);//配置串口参数;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断号;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE); //使能串口
}
void USART1_IRQHandler(void)
{
u8 rec_tem = 0;//--接收缓存
static u8 rec_count = 0;//--接收计数
static u8 Start_rec_flag1 = 0;//接受标志位
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
rec_tem = USART_ReceiveData(USART1);
if(rec_tem == open_first)//判断接受的数据的指令头是否正确
{
rec_count = 0;
Start_rec_flag1 = 1;
}
if(Start_rec_flag1)//开始接收
{
reccmd_temp1[rec_count ++] = rec_tem;//将接收到的一个字节数据存入 接收缓存
if(rec_count == command_length1)//接收完成
{
Start_rec_flag1 = 0;
rec_count = 0;
rec_flag1 = 1;
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除标志位;
}
}
//--协议解析 AA 01 00 00 00 00 00 00
void protocol_analysis(void)
{
if(reccmd_temp1[0] == 0xAA ) //判断是起始位和名称
{
reccmd_temp1[0] = 0;
switch(reccmd_temp1[1])//判断类型
{
case 0x01:
led_on; //开灯
everything+=1;
flag_first = 0;
break;
case 0x02:
led_off; //关灯
everything-=1;
flag_first = 1;
break;
}
}
}
usart1.h
#ifndef _usart1_H
#define _usart1_H
#include "stm32f10x.h"
#include "stdbool.h"
#include "stdio.h"
#include "led.h"
extern float everything;
//--指令长度
#define command_length1 8
//--接收缓存
extern u8 reccmd_temp1[command_length1];
//--接收标志
extern u8 rec_flag1;
extern u8 dis_tence;
extern u8 flag_first;
//--指令头
#define open_first 0xAA
//串口1初始化
void USART1_Int(void);
// 串口1 接收中断函数
void USART1_IRQHandler(void);
//串口协议
void protocol_analysis(void);
#endif
main.c
#include "stm32f10x.h"
#include "systick.h"
#include "led.h"
#include "usart1.h"
int main()
{
led_int();
delay_init();
USART1_Int();
while(1)
{
while(flag_first ==0)
{
protocol_analysis(); //串口协议解析
printf("t1.txt=\" %.3lf\r\n\"\xff\xff\xff", everything);//串口屏实时显示
}
}
}
在上述的串口屏实时显示的时候,使用串口屏软件中t1.txt的模块。即:everthing在t1.txt的模块中显示。
在串口屏软件中写的协议,如下所示:
?其中printh用于十六进制
|