赞
踩
【【步态详解】人人都可制作的WiFi遥控迷你四足机器人-哔哩哔哩】 https://b23.tv/kv98lEx
根据该up主的步态来设置舵机参数。
在这里设定A为1脚,D为3脚,C为2脚,B为4脚。
注意:在设定角度和脚时,应该根据舵机实际所安装的方向进行设定。
这里一共有8个状态,
1.A向前,D向前
2.B向后,C向后
3.A收脚,D收脚
4.B收脚,C收脚
5.B向前,C向前
6.A向后,D向后
7.B收脚,C收脚
8.A收脚,D收脚
代码:
Pet1_SetAngle(135);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(135);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(45);
Pet4_SetAngle(135);
Delay_ms(200);
Pet1_SetAngle(45);
Pet3_SetAngle(135);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
这里一共有8个状态,
1.A向后,D向后
2.B向前,C向前
3.A收脚,D收脚
4.B收脚,C收脚
5.B向后,C向后
6.A向前,D向前
7.B收脚,C收脚
8.A收脚,D收脚
代码:
Pet1_SetAngle(45);
Pet3_SetAngle(135);
Delay_ms(200);
Pet2_SetAngle(45);
Pet4_SetAngle(135);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(135);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(135);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
这里一共4个状态,
1.A向后,D向前
2.B向前,C向后
3.A收脚,D收脚
4.B收脚,C收脚
代码:
Pet1_SetAngle(45);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(45);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
这里一共4个状态,
1.B向前,C向后
2.A向后,D向前
3.B收脚,C收脚
4.A收脚,D收脚
代码:
Pet2_SetAngle(45);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(45);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
一共4个状态,
1.A,B,C,D向前
2.A,B,C,D收脚
3.A,B,C,D向后
4.A,B,C,D收脚
代码:
Pet1_SetAngle(135);
Pet3_SetAngle(45);
Pet2_SetAngle(45);
Pet4_SetAngle(135);
Delay_ms(200);
Pet1_SetAngle(45);
Pet3_SetAngle(135);
Pet2_SetAngle(135);
Pet4_SetAngle(45);
Delay_ms(200);
【开源!自制一个桌面宠物(STM32CUBEMX HAL库 PWM波 小项目) - CSDN App】http://t.csdnimg.cn/NyRD6
具体的表情源码在这个博主内去找,这里我只说一下使用方法:
在江科大的OLED 代码的OLED_Font.h文件中加入下列代码(具体内容填写根据你自己的需求):
extern unsigned char PI[][1024]=
{
//0.立正脸
{ },
//1.前进脸
{ },
//2.左转脸
{ },
//3.右转脸
{ },
//4.特殊脸
{ },
//5.睡觉脸
{ }
};
如图:
然后添加以下代码:
void OLED_MyShowChar(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char PI[])
{
unsigned int j=0;
unsigned char x,y;
// if(y1%8==0) y=y1/8;
// else y=y1/8+1;
for(y=y0;y<y1;y++)
{
OLED_SetCursor(y,x0); //第一个设置y,第二个设置x//设置光标位置左上角(0,0) 往下0-7 , 往右0-127
for(x=x0;x<x1;x++)
{
OLED_WriteData(PI[j++]); //写数据
}
}
// Delay_us(8000); //显示图片不行这个延时函数,但放动图需要
}
void OLED_BMP(int i)
{
OLED_Clear();
OLED_MyShowChar(0,0,127,0,PI[i]);
OLED_MyShowChar(0,0,127,1,PI[i]);
OLED_MyShowChar(0,0,127,2,PI[i]);
OLED_MyShowChar(0,0,127,3,PI[i]);
OLED_MyShowChar(0,0,127,4,PI[i]);
OLED_MyShowChar(0,0,127,5,PI[i]);
OLED_MyShowChar(0,0,127,6,PI[i]);
OLED_MyShowChar(0,0,127,7,PI[i]);
}
如图:
添加完成后,我说一下这个方法,首先这是基于江科大的OLED输出字符的,从程序中我们可以看到通过OLED_SetCursor将OLED分为了8*128,因此坐标填写y为0_7,x为0_127 对于后面的PI数组,从数据可看出,数据是64*16的,因此数组大小设置为1024,i是数据所处数组的行数,例如:我们想要使用前面所填写的特殊脸,那么使用OLED_BMP(4)即可。
/* (128 X 64 )*/
这种方法我是参考了这个博主的:
【基于江科大的OLED的图片,动图显示 - CSDN App】http://t.csdnimg.cn/8Ydqs
【开源!!!复刻一个桌面电子小狗!!Keil标准库版本-哔哩哔哩】 https://b23.tv/QPGj63k
这里使用了Up主设计的App。
注意:在蓝牙模块到货后,先进行相关测试。
具体测试需根据厂商给出的手册去测试。
这里我简单说一下:
首先是下载蓝牙模块厂商给的资料(电脑手机都要下载):
https://pan.baidu.com/s/1IgRkwkxopE5ekhpAorbLog
提取码:2wob
下载完成后将测试APP安装至手机上(也可以不安装):
就是这个。
其次是接线:
照这张图接就可以了。
注意:这里的VCC不要接入5v或者接入其他端口,有极大可能会烧坏芯片(我已经烧坏两个了)。
然后是测试:
使用厂商给的串口调试助手,然后如下图配置:
配置完成后,在串口调试助手的输入框内输入AT+NAME获取该蓝牙模块的名称,看下是否能正常返回,如果不能,检查一下接线是否有问题。
然后输入AT+VERSION获取当前版本信息。以上具体流程如下图:
这个测试可以不做,只要蓝牙是好的,可以直接用。
打开这个软件,首先去连接蓝牙。
如图:
然后会出现四个选项,点第三个
如图:
接下来如图点击便可开启透传:
接下来便可使用串口向蓝牙发送信息
如图:
也可以用蓝牙向串口发送信息
如图:
使用up主的蓝牙APP与蓝牙模块连接,连接后在串口助手上查看通过按键按下时所接收到的数据。这里由于我已经将蓝牙装上了 测试不了因此这里只说一下我自己使用的按键有哪些信息:
1."Advance" 后退
2."Retreat " 前进
3."Left " 左转
4."Right " 右转
5."Hard " 招手
6."Rock " 摇摆
7."Down " 趴下
8."Up " 立正
这里由于up主设置按键按下传入的数据是字符串,因此要使用strcmp来比较字符串,使用strcmp又需要使用string头文件。
具体实现如图:
测试完成后根据你自己设置的串口IO口进行连接。
这里由于我在组装时舵机将最初指定的串口1TX和RX口(PA9和PA10)挡住了,因此我通过查表将TX和RX口重映射到了PB6和PB7
STM32F103C8T6 引脚定义表:
重映射程序:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
这里的图和清单都是采用的这个up主的
【【教程】如何做一个可爱的桌面机器小猫小狗-哔哩哔哩】 https://b23.tv/b0Hgy6d
从接线图中可知,这个线路是非常多的,首先是四个舵机,一共就有12根线,因此将VCC和GND分别共接即可,这里注意:舵机的VCC需要接入5V电压,系统板接入3.3V电压。共接可以采用Up所说的分线板,也可以将杜邦线剥开扭接在一起,这里我采用的是扭接,扭接后使用绝缘胶布将其粘上即可。
这个文件我就不发了,在这个up主哪儿有。
#include "stm32f10x.h" // Device header
#include "string.h"
#include "Delay.h"
//#include "OLED.h"
#include "MyUsart.h"
#include "string.h"
#include "Pet_Action.h"
uint8_t Action = 9;
int main(void)
{
MyUsart_Init();
Pet_Action_Init();
Pet_Action_Stand();
Delay_ms(1000);
while(1)
{
if(MyUsart_RxFlag == 1)
{
if(strcmp(MyUsart_RxPacket, "Advance") == 0)
{Action = 0;OLED_BMP(1);}
if(strcmp(MyUsart_RxPacket, "Retreat") == 0)
{Action = 1;OLED_BMP(1);}
if(strcmp(MyUsart_RxPacket, "Left") == 0)
{Action = 2;OLED_BMP(3);}
if(strcmp(MyUsart_RxPacket, "Right") == 0)
{Action = 3;OLED_BMP(2);}
if(strcmp(MyUsart_RxPacket, "Hard") == 0)
{Action = 4;OLED_BMP(4);}
if(strcmp(MyUsart_RxPacket, "Rock") == 0)
{Action = 5;OLED_BMP(1);}
if(strcmp(MyUsart_RxPacket, "Down") == 0)
{Action = 6;OLED_BMP(5);}
if(strcmp(MyUsart_RxPacket, "Up") == 0)
{Action = 7;OLED_BMP(0);}
MyUsart_RxFlag = 0;
}
switch(Action)
{
case 0: Pet_Down();break;
case 1: Pet_Up();break;
case 2: Pet_Right();break;
case 3: Pet_Left();break;
case 4: Pet_zs();break;
case 5: Pet_yb();break;
case 6: Pet_px();break;
case 7: Pet_Stand();break;
default : ;break;
}
//OLED_BMP(0);Delay_ms(2000);
}
}
#include "stm32f10x.h" // Device header
#include "PWM.h"
#include "Delay.h"
void Pet_Init(void)
{
PWM_Init();
}
void Pet1_SetAngle(float Angle)
{
PWM_SetCompare1(Angle / 180 * 2000 + 500);
}
void Pet2_SetAngle(float Angle)
{
PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
void Pet3_SetAngle(float Angle)
{
PWM_SetCompare3(Angle / 180 * 2000 + 500);
}
void Pet4_SetAngle(float Angle)
{
PWM_SetCompare4(Angle / 180 * 2000 + 500);
}
void Pet_Stand(void)
{
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
}
void Pet_Up(void)
{
Pet1_SetAngle(135);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(135);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(45);
Pet4_SetAngle(135);
Delay_ms(200);
Pet1_SetAngle(45);
Pet3_SetAngle(135);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
}
void Pet_Down(void)
{
Pet1_SetAngle(45);
Pet3_SetAngle(135);
Delay_ms(200);
Pet2_SetAngle(45);
Pet4_SetAngle(135);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(135);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(135);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
}
void Pet_Right(void)
{
Pet1_SetAngle(45);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(45);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
}
void Pet_Left(void)
{
Pet2_SetAngle(45);
Pet4_SetAngle(45);
Delay_ms(200);
Pet1_SetAngle(45);
Pet3_SetAngle(45);
Delay_ms(200);
Pet2_SetAngle(90);
Pet4_SetAngle(90);
Delay_ms(200);
Pet1_SetAngle(90);
Pet3_SetAngle(90);
Delay_ms(200);
}
void Pet_yb(void)
{
Pet1_SetAngle(135);
Pet3_SetAngle(45);
Pet2_SetAngle(45);
Pet4_SetAngle(135);
Delay_ms(200);
Pet1_SetAngle(45);
Pet3_SetAngle(135);
Pet2_SetAngle(135);
Pet4_SetAngle(45);
Delay_ms(200);
}
void Pet_zs(void)
{
Pet1_SetAngle(60);
Delay_ms(150);
Pet1_SetAngle(30);
Delay_ms(150);
Pet1_SetAngle(0);
Delay_ms(150);
Pet1_SetAngle(30);
Delay_ms(150);
}
void Pet_px(void)
{
Pet1_SetAngle(45);
Pet2_SetAngle(135);
Pet3_SetAngle(135);
Pet4_SetAngle(45);
}
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1引脚初始化为复用推挽输出
//受外设控制的引脚,均需要配置为复用模式
/*配置时钟源*/
TIM_InternalClockConfig(TIM2); //选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
/*时基单元初始化*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //计数周期,即ARR的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //预分频器,即PSC的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元
/*输出比较初始化*/
TIM_OCInitTypeDef TIM_OCInitStructure; //定义结构体变量
TIM_OCStructInit(&TIM_OCInitStructure); //结构体初始化,若结构体没有完整赋值
//则最好执行此函数,给结构体所有成员都赋一个默认值
//避免结构体初值不确定的问题
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出比较模式,选择PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性,选择为高,若选择极性为低,则输出高低电平取反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //初始的CCR值
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC2Init(TIM2, &TIM_OCInitStructure); //将结构体变量交给TIM_OC2Init,配置TIM2的输出比较通道2
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
/*TIM使能*/
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行
}
/**
* 函 数:PWM设置CCR
* 参 数:Compare 要写入的CCR的值,范围:0~100
* 返 回 值:无
* 注意事项:CCR和ARR共同决定占空比,此函数仅设置CCR的值,并不直接是占空比
* 占空比Duty = CCR / (ARR + 1)
*/
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare); //设置CCR1的值
}
void PWM_SetCompare2(uint16_t Compare)
{
TIM_SetCompare2(TIM2, Compare); //设置CCR2的值
}
void PWM_SetCompare3(uint16_t Compare)
{
TIM_SetCompare3(TIM2, Compare); //设置CCR3的值
}
void PWM_SetCompare4(uint16_t Compare)
{
TIM_SetCompare4(TIM2, Compare); //设置CCR4的值
}
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <stdarg.h>
char MyUsart_RxPacket[100]; //定义接收数据包数组,数据包格式"@MSG\r\n"
uint8_t MyUsart_RxFlag;
void MyUsart_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1,ENABLE);
}
void MyUsart_SendByte(uint8_t Byte)
{
USART_SendData(USART1, Byte);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) ==RESET);
}
void MyUsart_SendArray(uint8_t *Array, uint16_t Length)
{
uint16_t i;
for(i = 0; i < Length; i++)
{
MyUsart_SendByte(Array[i]);
}
}
void MyUsart_SendString(char *String)
{
uint8_t i;
for(i = 0; String[i] != '\0';i++)
{
MyUsart_SendByte(String[i]);
}
}
uint32_t MyUsart_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while(Y--)
{
Result *= X;
}
return Result;
}
void MyUsart_SendNumber(uint32_t Number, uint8_t Lengh)
{
uint8_t i;
for(i = 0; i < Lengh; i++)
{
MyUsart_SendByte(Number / MyUsart_Pow(10,Lengh - i - 1) % 10 + 0x30);
}
}
/**
* 函 数:使用printf需要重定向的底层函数
* 参 数:保持原始格式即可,无需变动
* 返 回 值:保持原始格式即可,无需变动
*/
int fputc(int ch, FILE *f)
{
MyUsart_SendByte(ch); //将printf的底层重定向到自己的发送字节函数
return ch;
}
/**
* 函 数:自己封装的prinf函数
* 参 数:format 格式化字符串
* 参 数:... 可变的参数列表
* 返 回 值:无
*/
void MyUsart_Printf(char *format, ...)
{
char String[100]; //定义字符数组
va_list arg; //定义可变参数列表数据类型的变量arg
va_start(arg, format); //从format开始,接收参数列表到arg变量
vsprintf(String, format, arg); //使用vsprintf打印格式化字符串和参数列表到字符数组中
va_end(arg); //结束变量arg
MyUsart_SendString(String); //串口发送字符数组(字符串)
}
/**
* 函 数:USART1中断函数
* 参 数:无
* 返 回 值:无
* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
* 函数名为预留的指定名称,可以从启动文件复制
* 请确保函数名正确,不能有任何差异,否则中断函数将不能进入
*/
void USART1_IRQHandler(void)
{
static uint8_t RxState = 0; //定义表示当前状态机状态的静态变量
static uint8_t pRxPacket = 0; //定义表示当前接收数据位置的静态变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断是否是USART1的接收事件触发的中断
{
uint8_t RxData = USART_ReceiveData(USART1); //读取数据寄存器,存放在接收的数据变量
/*使用状态机的思路,依次处理数据包的不同部分*/
/*当前状态为0,接收数据包包头*/
if (RxState == 0)
{
if (RxData == '@' && MyUsart_RxFlag == 0) //如果数据确实是包头,并且上一个数据包已处理完毕
{
RxState = 1; //置下一个状态
pRxPacket = 0; //数据包的位置归零
}
}
/*当前状态为1,接收数据包数据,同时判断是否接收到了第一个包尾*/
else if (RxState == 1)
{
if (RxData == '\r') //如果收到第一个包尾
{
RxState = 2; //置下一个状态
}
else //接收到了正常的数据
{
MyUsart_RxPacket[pRxPacket] = RxData; //将数据存入数据包数组的指定位置
pRxPacket ++; //数据包的位置自增
}
}
/*当前状态为2,接收数据包第二个包尾*/
else if (RxState == 2)
{
if (RxData == '\n') //如果收到第二个包尾
{
RxState = 0; //状态归0
MyUsart_RxPacket[pRxPacket] = '\0'; //将收到的字符数据包添加一个字符串结束标志
MyUsart_RxFlag = 1; //接收数据包标志位置1,成功接收一个数据包
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除标志位
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。