串口控制小车、wifi、4g则需要发送响应指令使连接成功后才可以用串口控制
#
include
"string.h"
#
include
"stdio.h"
#
include
"motor.h"
//
串口接收缓存(
1
字节)
uint8_t
buf
=
0
;
//
定义最大接收字节数
200
,可根据需求调整
#
define
UART1_REC_LEN 200
//
接收缓冲
,
串口接收到的数据放在这个数组里,最大
UART1_REC_LEN
个字节
uint8_t
UART1_RX_Buffer
[
UART1_REC_LEN
];
//
接收状态
// bit15
, 接收完成标志
// bit14
, 接收到
0x0d
// bit13~0
, 接收到的有效字节数目
uint16_t
UART1_RX_STA
=
0
;
#
define
SIZE 12
char
buffer
[
SIZE
];
//
接收完成回调函数,收到一个数据后,在这里处理
void
HAL_UART_RxCpltCallback
(
UART_HandleTypeDef
*
huart
)
{
//
判断中断是由哪个串口触发的
if
(
huart
->
Instance
==
USART1
)
{
//
判断接收是否完成(
UART1_RX_STA bit15
位是否为
1
)
if
((
UART1_RX_STA
&
0x8000
)
==
0
)
{
//
如果已经收到了
0x0d
(回车),
if
(
UART1_RX_STA
&
0x4000
)
{
//
则接着判断是否收到
0x0a
(换行)
if
(
buf
==
0x0a
)
{
//
如果
0x0a
和
0x0d
都收到,则将
bit15
位置为
1
UART1_RX_STA
|=
0x8000
;
//
灯控指令
if
(
!
strcmp
(
UART1_RX_Buffer
,
"M1"
))
goForward
();
else if
(
!
strcmp
(
UART1_RX_Buffer
,
"M2"
))
goBack
();
else if
(
!
strcmp
(
UART1_RX_Buffer
,
"M3"
))
goLeft
();
else if
(
!
strcmp
(
UART1_RX_Buffer
,
"M4"
))
goRight
();
else
stop
();
memset
(
UART1_RX_Buffer
,
0
,
UART1_REC_LEN
);
UART1_RX_STA
=
0
;
}
else
//
否则认为接收错误,重新开始
UART1_RX_STA
=
0
;
}
else
//
如果没有收到了
0x0d
(回车)
{
//
则先判断收到的这个字符是否是
0x0d
(回车)
if
(
buf
==
0x0d
)
{
//
是的话则将
bit14
位置为
1
UART1_RX_STA
|=
0x4000
;
}
else
{
//
否则将接收到的数据保存在缓存数组里
UART1_RX_Buffer
[
UART1_RX_STA
&
0X3FFF
]
=
buf
;
UART1_RX_STA
++
;
//
如果接收数据大于
UART1_REC_LEN
(
200
字节),则重新开始接收
if
(
UART1_RX_STA
>
UART1_REC_LEN
-
1
)
UART1_RX_STA
=
0
;
}
}
}
//
重新开启中断
HAL_UART_Receive_IT
(
&
huart1
,
&
buf
,
1
);
}
}
int
fputc
(
int
ch
,
FILE
*
f
)
{
unsigned char
temp
[
1
]
=
{
ch
};
HAL_UART_Transmit
(
&
huart1
,
temp
,
1
,
0xffff
);
return
ch
;
}
main.c
#
include
"motor.h"
extern
uint8_t
buf
;
//main
函数
HAL_UART_Receive_IT
(
&
huart1
,
&
buf
,
1
);
点动控制小车
![](https://img-blog.csdnimg.cn/e18f905515bb4360a435b0be78b909c1.png)
PWM调速小车 开启定时器配置时间、模式 注意有效电平是高低电平、则车子另一个轮电平要相反才能驱动
![](https://img-blog.csdnimg.cn/c7d42c86743f4c98ad456d58e775ddce.png)
在时间内 有效电平越多 能量越大则越快
循迹小车---
循迹小车--- 通过PWM 解决平滑拐弯问题
跟随小车 模仿循迹小车
![](https://img-blog.csdnimg.cn/40e9775009524e2f9209ef9328fff5da.png)
摇头避障小车------SG90、超声波 要用到两个定时器
SG90配置
超声波配置一个1us的定时器 计数一次则是1us
避障完整
测速小车(两个中断 gpio中断 和定时器中断)
:测速模块周长知道 有20格子 每个电平转变一次就是1cm 用中断计数 配置定时器中断1s产生中断 计算出中断count++的值除以时间1s ==== 速度
将速度显示在OLED屏幕上 code MX配置I2C 连接oled屏幕
语音小车 低高高 高低高 低高高 代码整合,引脚合理配置。