0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

19.4-STM32接收数据-状态显示在屏幕 openMV寻迹与小车控制 Openmv+STM32F103C8T6视觉巡线小车

dfhjgfg 来源:dfhjgfg 作者:dfhjgfg 2024-08-20 11:12 次阅读

** **功能介绍放开头, 使用便捷无需愁

这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章节代码手把手教会你如何开发和调试。让你更快掌握嵌入式系统开发。

**V3.3.0-STM32智能小车 **

**视频: **[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]
V3:HAL库开发、功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、视觉控制、电磁循迹、RTOS等功能。

19.4-STM32接收数据-状态显示在屏幕

先通过串口上位机模拟发送、

STM32有视觉循迹模式、该模式下接收到数据根据状态显示在屏幕上,现在此状态并不控制电机。
在这里插入图片描述
复制一下18在上面基础改,命名成****19-4_LED

可以先复制到桌面英文路径,防止出现中文路径兼容问题。
在这里插入图片描述
在这里插入图片描述
看原理图摄像头是预留什么引脚
在这里插入图片描述
PCB中可以看到接口位置
在这里插入图片描述
所以我们要初始化一下串口二,然后开启串口接收中断
在这里插入图片描述
串口2 开启初始化

在这里插入图片描述
开启串口中断
在这里插入图片描述
生成代码
在这里插入图片描述
打开代码

在这里插入图片描述
如果发现18章代码经常出现黑屏,那可能就是6050的初始化卡住了,我们可以注释掉一下MPU6050部分的代码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们先定义一个串口二接收数据变量

uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的数据

在这里插入图片描述
开启接收中断

HAL_UART_Receive_IT(&huart2,&g_ucUsart2ReceiveData,1);  //串口二接收数据

在这里插入图片描述
声明一下变量

extern uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的数据

在这里插入图片描述
我们需要在串口中断回调函数中加入我们对接收到数据的解析

if(huart == &huart2)//判断中断源 是否来自串口二
{
//这里增加解析函数
HAL_UART_Receive_IT(&huart2,&g_ucUsart2ReceiveData,1);  //启动串口二接收数据
}

在这里插入图片描述
在usart.c文件中定义一个函数
在这里插入图片描述
在这里插入图片描述

/*******************
*  @brief  摄像头串口协议解析函数 可以连接K210或openmv等
*  @param  data:串口接收到的每个字节
*  @return  
*
*******************/
void usartCamera_Receive_Data(uint8_t data)
{
static uint8_t state = 0;//定义静态static 变量

if(state==0&&data==0xA5) //判断第一个是不是帧头0xA5
{
state=1;//是帧头0xA5 赋值state=1 表示接收下一个数据
//数据存储在数组中 "g_ucUsart2ReceivCounter++",这里是先用后加,比如g_ucUsart2ReceivCounter 初值为0,执行这个是先g_ucaUsart2ReceiveBuffer[0]=data,然后g_ucUsart2ReceivCounter++,即后g_ucUsart2ReceivCounter = 1的
g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter++] = data;
}
else if(state==1&&data==0xA6) //第二个是不是帧头0xA6
{
state=2;//如果第二个是帧头0xA6 赋值state=2 表示接收下一个数据
g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter++] = data;//保存数据
}
else if(state==2)//然后确定开头是0XA5 0XA6 就开始接收
{
g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter++]=data;
if(g_ucUsart2ReceivCounter >9||data==0x5B) state=3;  //接收大于9个或者接收到帧尾0X5B 就置位状态三
}
else if(state==3) //状态三
{
if(g_ucaUsart2ReceiveBuffer[g_ucUsart2ReceivCounter-1] == 0x5B)  //确定 最后一个是不是0x5B帧尾 是帧尾0x5B 就认为通信正确 处理数据
{
state = 0;//这里就可以处理数据了、处理完记得清空数组和重置标志位与计数值
g_ucUsart2ReceivCounter = 0;//清零计数值
//比如根据数据设置红外旋转偏移状态//1.设置快速 慢速右边 左边 数字存储的变量意义: [0]和[1]:帧头、[2]:摄像头左边数第一个感兴趣区域、[3]:左边第二个、[4]:左边第三个、[5]:左边第四个、[6]:左边第五个、[7]:帧尾
 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {
g_cThisState=0;//前进
g_lHW_State=22222;//设置这个显示在OLED上方便调试 五个值 以此从左向右表示 从左向右的五个区域
 }
 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==1&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {
g_cThisState=-1;//应该右转
g_lHW_State=22212;//表示右数第二个 识别到线
 }
 if(g_ucaUsart2ReceiveBuffer[6]==1&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {g_cThisState=-2;//快速右转
 g_lHW_State=22221;
 }
 if(g_ucaUsart2ReceiveBuffer[6]==1&&g_ucaUsart2ReceiveBuffer[5]==1&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==0)
 {g_cThisState=-3;//快速右转
 g_lHW_State=22211;
 }
 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==1&&g_ucaUsart2ReceiveBuffer[2]==0)
 {g_cThisState=1;//应该左转
 g_lHW_State=21222;
 }
                 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==0&&g_ucaUsart2ReceiveBuffer[2]==1)
 {g_cThisState=2;//快速左转
 g_lHW_State=12222;
 }
                 if(g_ucaUsart2ReceiveBuffer[6]==0&&g_ucaUsart2ReceiveBuffer[5]==0&&g_ucaUsart2ReceiveBuffer[3]==1&&g_ucaUsart2ReceiveBuffer[2]==1)
 {g_cThisState=3;//快速左转
 g_lHW_State=11222;
 }
​
//2.然后清空数组
for(int i=0;i< 10;i++) g_ucaUsart2ReceiveBuffer[i]=0x00;//清空数组

}
else //不是帧尾说明通信错误重新开始接收
{
state=0;
g_ucUsart2ReceivCounter =0;
for(int i=0;i< 10;i++) g_ucaUsart2ReceiveBuffer[i]=0x00;//清空数组
}
}
else
{//其他异常清空
state=0;
g_ucUsart2ReceivCounter =0;
for(int i=0;i< 10;i++) g_ucaUsart2ReceiveBuffer[i]=0x00;//清空数组
}
}

然后声明一下变量

extern int8_t g_cThisState ;//这次状态

在这里插入图片描述
定义一个变量 并且在main文件中声明一下

int g_lHW_State = 0;//帮助视觉调试 用于表示红外对管或者视觉摄像头识别状态

在这里插入图片描述
声明一下

extern int g_lHW_State;//帮助视觉调试 用于表示红外对管或者视觉摄像头识别状态

在这里插入图片描述
我们需要再定义模式,这个模式是视觉循迹模式

视觉模式下 我们显示一下,我们之前赋值的变量 以测试我们接收的数据是否正确。

//这里编写触发中断后要执行的程序
			if(g_ucMode == 6) g_ucMode = 1;//g_ucMode模式是0 1 2 3 4 5  6
			else
			{
				g_ucMode+=1;
			}

在这里插入图片描述
增加模式6,的功能,我们先只显示视觉识别结果

if(g_ucMode == 6)
	{
		sprintf((char*)OledString, "lHW:%d  ", g_lHW_State);//视觉识别结果
		OLED_ShowString(0,0,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,
		motorPidSetSpeed(0,0);//停住电机防止乱跑 方便调试
	}

在这里插入图片描述
别忘记我们的解析函数,加到串口中断处理函数中

usartCamera_Receive_Data(g_ucUsart2ReceiveData);

在这里插入图片描述
修改上面程序经过测试,单片机

编译上面程序,并烧录到我们的单片机、单片机连接到电脑、然后电脑模拟openmv发送正确格式的数据,手动点击SSCOM发送数据、单片机可以接收到数据并显示在OLED上(观察的是OLED的第一行数值变化)、当我们设置每1ms发送一次数据时候,单片机的OLED有时候会出现卡死的情况。所以是单片机串口接收大量数据卡死的情况,经过网上搜索发现解决问题的办法。

这个博客是搜索到可以解决问题的链接: [https://blog.csdn.net/qq_44629109/article/details/131002223]

参考博客如下部分:
在这里插入图片描述
所以我们要更改如下代码:

__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);// 启用UART2的错误中断功能

在这里插入图片描述
在USART.C 中添加如下代码

/* UART 错误回调函数 处理串口错误 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) //使用__HAL_UART_GET_FLAG宏检查UART的overrun错误标志位是否被置位。如果返回值不等于RESET,表示overrun错误标志位被置位,即发生了overrun错误
    {
        __HAL_UART_CLEAR_OREFLAG(huart);//使用__HAL_UART_CLEAR_OREFLAG宏清除UART的overrun错误标志位
        HAL_UART_Receive_IT(&huart2,&g_ucUsart2ReceiveData,1);  //使用HAL库函数启动UART2接收中断,并设置接收缓冲区的大小为1字节
    }
}

在这里插入图片描述
添加串口2接收变量的声明

extern uint8_t g_ucUsart2ReceiveData;  //保存串口二接收的数据

在这里插入图片描述
让单片机处于模式6(按六下 KEY1)
在这里插入图片描述
上面我们测试通过上位机发送数据,然后观察屏幕。

然后我们把STM32底板接到openmv,openmv连接电脑,openmv使用的程序是19章3节的程序****19-3-openmv
在这里插入图片描述
然后上面如果没有问题,就可以把openmv 程序通过"将打开的脚本保存到openmv Cam(作为main.py)"

接法如下:
在这里插入图片描述
这里就说明了如何接受的数据,后面的19.5讲解利用数据

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5056

    文章

    18950

    浏览量

    301467
  • 小车
    +关注

    关注

    0

    文章

    54

    浏览量

    20828
  • STM32F103C8T6
    +关注

    关注

    106

    文章

    160

    浏览量

    82997
  • 寻迹
    +关注

    关注

    0

    文章

    6

    浏览量

    12556
  • openMV
    +关注

    关注

    3

    文章

    39

    浏览量

    9779
收藏 人收藏

    评论

    相关推荐

    19.3-星曈科技 openmv Hopenmv发送五个uchar Openmv+STM32F103C8T6视觉线小车 STM32循迹小车系列教程

    19.3-【星曈科技】openmv Hopenmv发送五个uchar Openmv+STM32F103C8T6视觉线
    的头像 发表于 08-20 11:32 726次阅读
    19.3-星曈科技 <b class='flag-5'>openmv</b> Hopenmv发送五个uchar <b class='flag-5'>Openmv+STM32F103C8T6</b><b class='flag-5'>视觉</b><b class='flag-5'>巡</b><b class='flag-5'>线</b><b class='flag-5'>小车</b> <b class='flag-5'>STM32</b>循迹<b class='flag-5'>小车</b>系列教程

    通过STM32输出PWM波给驱动模块进行小车运动状态控制

    、与树莓派串口通信:实现与树莓派的串口收发字符类型数据功能。4、OLED屏的显示:让OLED屏能显示表示当前状态的字符。1、控制
    发表于 08-16 07:33

    基于stm32红外线小车的设计资料分享

    基于stm32的红外线小车(基础版)硬件篇软件篇一、硬件篇1.stmf103c8t6最小系统板2.l298n电机驱动模块3.两个红外传感器
    发表于 12-07 06:22

    基于openMV的追球小车设计资料分享

    程序设计【microPython】2)STM32控制程序设计 【C语言】①对OpenMV发送的数据包进行解析②
    发表于 01-14 09:23

    基于STM32F103C8T6线小车制作过程以及出现的问题参考

    基于STM32F103C8T6线小车制作过程以及出现的问题参考
    发表于 01-20 06:56

    基于openmv与51小车串口通信线的相关资料推荐

    **基于openmv与51小车的串口通信线**新手小菜鸡,写的可能不大行,欢迎大神指正。硬件连接:我用的是openmv3(注意供电电压端V
    发表于 01-24 07:26

    基于OPENMVSTM32的识别追踪小车设计实现

    STM32控制器的寻物小车,不多说,直接进入正题!材料准备小车底盘直流减速电机杜邦线若干7.2V电源L298N模块
    发表于 02-25 06:21

    基于stm32的红外线小车(基础版)

    基于stm32的红外线小车(基础版)硬件篇软件篇一、硬件篇1.stmf103c8t6最小系统板2.l298n电机驱动模块3.两个红外传感器
    发表于 11-23 18:21 0次下载
    基于<b class='flag-5'>stm32</b>的红外<b class='flag-5'>巡</b><b class='flag-5'>线</b><b class='flag-5'>小车</b>(基础版)

    基于openmv与51小车的串口通信线

    **基于openmv与51小车的串口通信线**新手小菜鸡,写的可能不大行,欢迎大神指正。硬件连接:我用的是openmv3(注意供电电压端V
    发表于 11-29 11:06 54次下载
    基于<b class='flag-5'>openmv</b>与51<b class='flag-5'>小车</b>的串口通信<b class='flag-5'>巡</b><b class='flag-5'>线</b>

    循迹识别小车:(二)STM32部分

    、与树莓派串口通信:实现与树莓派的串口收发字符类型数据功能。4、OLED屏的显示:让OLED屏能显示表示当前状态的字符。1、控制
    发表于 12-28 19:09 8次下载
    循迹识别<b class='flag-5'>小车</b>:(二)<b class='flag-5'>STM32</b>部分

    OPENMVSTM32的识别追踪小车(详细版)之OPENMV

    STM32控制器的寻物小车,不多说,直接进入正题!材料准备小车底盘直流减速电机杜邦线若干7.2V电源L298N模块
    发表于 01-13 12:05 0次下载
    <b class='flag-5'>OPENMV</b>和<b class='flag-5'>STM32</b>的识别追踪<b class='flag-5'>小车</b>(详细版)之<b class='flag-5'>OPENMV</b>端

    【DIY】基于OpenMVSTM32追球小车

    简单识别程序设计【microPython】2)STM32控制程序设计 【C语言】①对OpenMV发送的数据包进行解析②
    发表于 01-14 13:01 39次下载
    【DIY】基于<b class='flag-5'>OpenMV</b>的<b class='flag-5'>STM32</b>追球<b class='flag-5'>小车</b>

    stm32平衡小车

    stm32f103c8t6的平衡小车的代码
    发表于 06-15 14:51 50次下载

    使用stm32f103c8t6设计的蓝牙小车

    使用stm32f103c8t6设计的蓝牙小车,具有前进后退,左转右转等功能
    发表于 08-07 16:08 25次下载

    第19.2章-星曈科技 openmv H7 plus openmv视觉循迹功能-完成视觉识别指定区域 OpenMV视觉模块循迹 STM32F103C8T6视觉线

    第19.2章-【星曈科技】openmv H7 plus openmv视觉循迹功能-完成视觉识别指定区域 OpenMV
    的头像 发表于 08-20 11:28 385次阅读