bitfinex

              您好, 登录| 注册  
              论坛导航
              您好, 登录| 注册|
              子站:

              【工程师6】+实践类+多功能控制小车(已完结)
              阅读: 20290 |  回复: 89 楼层直达

              2019/08/10 12:40:50
              1
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

                  DIY小车这个项目已经很多了,对于前后左右等控制,司空见惯,这次尝试一下能监控的多功能控制小车,电脑,手机都可以!

              多功能车基本功能参数和关键部件,视频传输这块和我们现在智能家具这块无线视频原理一样,下面会有介绍

              1.输入电源:2串或3串的锂电池(带充电器)

              2.输出5v,3.3V等电压为负载供电

              3.四个直流减速电机

              4.WIFI数传???/span>

              5.电机驱动???/span>

              6.STM32F105主控板

              7.UVC摄像头

              8.小车底盘

              最后实现电脑或手机通过wifi和软件控制小车动作并实时监控

              框图

              2019/08/10 19:11:54
              2
              斌520
              电源币:4753 | 积分:17 主题帖:28 | 回复帖:1722
              LV9
              军长
              一句话新闻?具体内容呢?
              2019/08/10 21:57:07
              3
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              已经更新了
              2019/08/10 22:05:39
              4
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              基本框图:

              2019/08/10 22:10:59
              5
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              基本编程软件

              keil5

              2019/08/11 11:54:16
              6
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              对于单片机编程这块,目前STM32占用非常多,涉及到库函数和寄存器编程

              这次采用库函数编程,采用传统的标准库,HAL库后续可以

              如上图所示,先把框架建立好,拿一个自己用的工程,把相应的函数添加进去就可以了

              2019/08/11 11:59:00
              7
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              有这块的入门教程吗
              2019/11/24 17:42:39
              69
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              单片机入门视频的话,挺多的,只能给点小建议,C语言基础扎实,建立自己的代码库,到时做项目非常方便的
              2019/11/24 17:53:26
              73
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              谢谢啊??创罄泻枚嗵佣际侨砑?,要是能分享代码库就非常给力了
              2019/08/12 12:49:50
              9
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长

              这个处理视频的话,需要上系统?

              2019/09/08 20:12:58
              22
              gxg1122
              电源币:177 | 积分:6 主题帖:200 | 回复帖:1802
              LV10
              司令
              视频实时上传,下端有显示屏吗?还是通过上位机软件显示控制。
              2019/11/24 17:47:04
              71
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              通过手机APP来监控和控制小车的
              2019/11/24 17:46:09
              70
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              肯定要上的,需要刷OpenWrt系统的
              2019/09/08 20:12:09
              21
              gxg1122
              电源币:177 | 积分:6 主题帖:200 | 回复帖:1802
              LV10
              司令
              这个STM开发,WIFI???、小车驱动、串口都是??榘咐袄?。
              2019/11/24 17:48:12
              72
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              普通的wifi???,比如8266例程很多的,但是视频传输??椴欢?
              2019/08/11 21:40:28
              8
              gxg1122
              电源币:177 | 积分:6 主题帖:200 | 回复帖:1802
              LV10
              司令
              多功能控制小车的设计增加了这么多???,主控芯片资源及响应速度能跟上吗?
              2019/08/12 22:03:58
              10
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              主控单片机只负责解析串口发来的命令并执行小车动作,
              2019/08/12 23:14:28
              11
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              舵机这块是两个,上下,左右各一个,180度旋转

              2019/08/12 23:19:41
              12
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              舵机的基本控制原理

              控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

              舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

                 0.5ms--------------0度;

                 1.0ms------------45度;

                 1.5ms------------90度;

                 2.0ms-----------135度;

                 2.5ms-----------180度;

              2019/08/15 22:25:26
              13
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              看看程序中是怎么控制的

              用STM32硬件PWM和模拟PWM都可以

              TIM_OCInitTypeDef  TIM_OCInitStructure; 
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    //?????aPWM?£ê?1
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_Pulse = Speed_Left-1;	  //éè??í¨μà2μ?μ???ì?±??μ£?ê?3?áííaò???????±èμ?PWM
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //μ±?¨ê±?÷??êy?μD?óúCCR1_Valê±?a??μ???
                TIM_OC1Init(TIM5, &TIM_OCInitStructure);	 //ê1?üí¨μà1
                TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
              我们改变这个值
               Speed_Left-1就可以改变舵机角度

              2019/08/15 22:32:13
              14
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              这个是整个产品的核心wifi???

              wifi数传??槭?/span>基于MIPS 24K 高通CPU的一款WIFI1X1芯片AR9331,其SDK采用uboot作为引导。是基于MIPS 架构的,目前有x86、ARM和MIPS三种主流芯片架构,ARM集架构的主要特点:一是体积小、低功耗、低成本、高性能;二是大量使用寄存器且大多数数据操作都在寄存器中完成,命令执行速度更快;三是寻址方式灵活简单,执行效率高;四是命令长度固定,可通过多流水线方式提高处理效率。

              2019/08/15 22:46:34
              15
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              wifi??榈墓ぷ髟?

              WiFi??橥ü杉以卦赨SB接口的MJPG格式的摄像头的数据,并编码封装成http协议的视频流,默认推送到8080端口。Android/IOS/PC设备,连接到WiFi??榈娜鹊愫?,打开控制软件,会自动从8080端口获取MJPG视频流,并进行解码、显示。由此实现了WiFi智能小车的实时视频传输功能。

              2019/08/19 12:21:34
              16
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              这个wifi??榭梢粤油馔?
              2019/08/20 07:06:05
              17
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              主要是把wifi??樽魑鹊闶褂?,连接外网不是太稳定
              2019/08/20 12:33:01
              18
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              其实这个要想实现WIFI的视频传输,还需要一个小型的linux系统,下面会讲解一下
              2019/08/25 08:58:25
              19
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              OpenWrt 可以被描述为一个嵌入式的 Linux 发行版。(主流路由器固件有 dd-wrt,tomato,openwrt三类)对比一个单一的、静态的系统,OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。

              对于开发人员,OpenWrt 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。

              2019/09/07 10:02:56
              20
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              这个还需要刷linux系统?
              2019/09/15 07:49:36
              27
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              这个需要刷openwrt系统的
              2019/09/08 20:17:36
              24
              gxg1122
              电源币:177 | 积分:6 主题帖:200 | 回复帖:1802
              LV10
              司令
              这个不用linux系统吧,UC系统就可以了。
              2019/09/08 20:20:27
              25
              gxg1122
              电源币:177 | 积分:6 主题帖:200 | 回复帖:1802
              LV10
              司令
              这个不用linux系统吧,UC系统就可以了。
              2019/09/10 17:40:36
              26
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              UC系统是?
              2019/09/16 15:05:14
              35
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              UC还真不知道,这个是微小的LINUX系统
              2019/09/15 17:19:39
              34
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              高通骁龙的芯片,这个wifi??橥ε5?
              2019/09/16 15:05:38
              36
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              就是一个图传???,还可以
              2019/09/15 08:40:18
              30
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              看看舵机怎么控制转动速度

              舵机的转动速度取决于起始角度和目标角度的差,差别越大转得越快,当接近时就放慢角度。所以没有专门的函数控制转速。但在大角度转动时,你可以用程序把它设成几个小角度递进,这样可以放慢速度。也通过delay进行慢速,但快速的话只有加高电压了 。

              2019/09/08 20:15:02
              23
              gxg1122
              电源币:177 | 积分:6 主题帖:200 | 回复帖:1802
              LV10
              司令
              响应速度是够用,串口解析及小车控制。
              2019/09/15 07:52:31
              28
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              老哥对这块非常熟悉啊,响应速度可以的
              2019/09/15 08:29:27
              29
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              这个是实际的wifi图传???

              2019/09/15 08:47:40
              31
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              现在在重申一下这个??榈墓ぷ髟砗褪褂梅椒?

              WiFi??橥ü杉以卦赨SB接口的MJPG格式的摄像头的数据,并编码封装成http协议的视频流,默认推送到8080端口。Android/IOS/PC设备,连接到WiFi??榈娜鹊?

              (wifi-robots.com开头的SSID信号)后,打开控制软件,会自动从8080端口获取MJPG视频流,并进行解码、显示。由此实现了WiFi智能小车的实时视频传输功能。

              们简单恢复一下出厂设置就可以了,简单说一下,用USB转tll工具连接??榕渲煤貌ㄌ芈剩?7600)和串口号一定注意先后顺序

              1:点击打开串口,此时WIFI的状态是没有上电的

              2:给WIFI上电此时要注意串口开始打?。ê芄丶?,

              3:输入命令firstboot就可以了

              2019/09/15 09:46:34
              32
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              这个wifi??樵趺此⒐碳penwrt系统的

              首先通过USB口给设备供电,通过miniUSB口加上usb转网口网线连接电脑

              准备刷机工具TFTP服务端:tftp32  就是局域网内可以传文件

              超级终端:putty  Telnet、SSH、rlogin、纯TCP以及串行接口连接软件

              需要相应的固件具体教程http://www.wifi-robots.com/thread-108-1-1.html

              2019/09/15 10:08:33
              33
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              最后我们看看USB摄像头这块,简单介绍一下无线监控中的摄像头

              1.摄像头选择

              做本次实验的时候,推荐大家用 USB 免驱的摄像头,最好是支持 MJPEG 输出的摄像头类型。USB 免驱摄像头输出 YUV 格式和输出 MJPEG 格式,对无线监控的效果有什么影响呢?首先大家要知道,同样是一帧数据,YUV 格式会比 MJPEG 格式的大得多,因此我们在视频传输的时候,一般是传输 MJPEG 格式的数据。这样,就有这样一个问题,如果摄像头是输出 YUV 格式,那么就意味着我们需要通过软件将视频数据由 YUV 格式转换成 MJPEG格式,然后传输。如果摄像头输出的是 MJPEG 格式,那个将可以直接将得到的数据进行传输。因此,使用支持 MJPEG 压缩的摄像头,比一般的摄像头,做无线监控的效果,好很多

              2019/09/23 09:11:14
              40
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              2.配置 OpenWrt 支持 usb 摄像头

              看看怎么配置

              要支持摄像头,就必须配置上摄像头的驱动,因为是免驱的 USB 摄像头,因此我们必须配置上 UVC 驱动,具体如图所示。首先,我们选中内核??榻信渲茫?/span>

              选中 Video 支持配置:

              按”y”选中 kmod-video-core:

              在展开的选项中选中 uvc:

              2019/09/23 10:59:18
              41
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              只要支持UVC驱动的摄像头都可以这样操作?
              2019/10/01 07:47:57
              42
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              原理是这样的
              2019/10/01 14:55:26
              43
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              看看电机驱动???

              2019/10/01 14:57:05
              44
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              基本原理如下

              看看具体是怎么控制电机调速的,通过控制使能端使L298N处于工作和不工作,VSS-9引脚为芯片供电   VS-4引脚为电机供电   ENA-6引脚为通道1使能端,利用定时器的pwm输出作用于ENA,根据脉冲占空比不同就可以得到不同的输出电压,从而达到调速目的。比如在VS引脚加10V的电机供电电压,ENA端脉冲占空比为100%,那么OUT1和OUT2之间将输出10V电压,占空比为50%,那么输出为5V电压,占空比为10%,则为1V    我买的电机供电电压为5v到12v都可以,电压高的话也可以,长时间工作的话会对电机损坏

              2019/10/01 14:59:27
              45
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              看看电机是怎么正反装 的

              逻辑输入端,为IN1\IN2\IN3\IN4,其中IN1、IN2控制电机M1;IN3、IN4控制电 机M2。例如IN1输入高电平1,IN2输入低电平0,对应电机M1正转;IN1输入低电平0,IN2输入高电平1,对应电机M1反转,调速就是改变高电平的占空比

              2019/10/01 15:01:19
              46
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              这是整个系统的核心板STM32F105

              2019/10/02 15:22:56
              47
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              正好国庆期间可以把程序写写,用一个stm32f103的模板,还是103的标准库,改一下测试再105上可以不?

              2019/10/02 15:37:29
              48
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              主要就是串口这块,但是奇怪的是串口通讯不正常

              波特率9600是一致的,用串口助手发送,发送FE是没有任何反应的,发送其他,接受的也不一样,多年的编程,程序应该问题不大

              2019/10/02 17:49:06
              49
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              就怀疑时钟的问题,先软件仿真看看,调试状态找到RCC

              看看能看出来时钟对不

              2019/10/02 18:01:41
              50
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              寄存器里面的值不太了解

              可以通过一个时钟函数RCC_GetClocksFreq(&RCC_Clocks)加到主函数里,把RCC_Clocks变量加到窗口中,看看实际的时钟频率

              发现时钟不对,再网上查看资料说105和103的启动文件不一样

              宏定义这需要改成STM32F10X_CL,

              2019/10/02 18:16:34
              51
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              由于105系列属于互联型单片机,默认晶振为25M,而我们实际为8M

              1.需要在这个stm32f10x.h文件里更改

              2.需要在这个system_stm32f10x.c文件里更改

              2019/10/02 18:31:28
              52
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              现在我们在仿真调试看看实际的时钟频率

              主频这个16进制值为0x044AA200,经过计算为72.000000

              这样就配置ok了

              2019/10/08 12:40:16
              53
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              用一个函数读取当前系统时钟,时钟频率这块分析很透彻
              2019/10/09 21:18:40
              54
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              个人认为这个就是读取当前系统时钟的最好办法了,
              2019/10/17 10:44:57
              55
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              基本的103移植105成功,程序这块后续简单分析一下,下面开始组装调试
              2019/11/02 11:25:40
              56
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              为了让小车强劲有力,我们采用松下的18650电池,一个是2600MAH,两串两并的话就是8.4V ,总容量10400MAH

              这是两个电池的

              加上快充充电器,网上买的,后续介绍

              2019/11/03 08:36:57
              57
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              我们现在准备组装小车

              这是小车底盘

              2019/11/03 12:32:40
              58
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              组装锂电池

              完毕

              2019/11/03 12:34:20
              59
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              剩下的小车组装完毕

              下面开始程序调试

              2019/11/04 08:23:09
              60
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              手机APP是自己开发?
              2019/11/06 21:41:10
              61
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              手机APP这快开发的,有啥问题可以讨论
              2019/11/11 12:45:20
              63
              keyhei66
              电源币:61 | 积分:3 主题帖:1 | 回复帖:10
              LV2
              班长
              小车的舵机是多少电压供电的,单片机这块能否分享资料,小白一个
              2019/11/17 08:44:39
              66
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              小车的电机直接有电池供电,L298N驱动

              舵机这块有电池降压5V供电

              2019/11/06 21:44:53
              62
              EDSTRNDDF
              电源币:56 | 积分:2 主题帖:0 | 回复帖:64
              LV4
              连长
              2019/11/17 08:31:41
              65
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              有啥疑问可以讨论
              2019/11/11 12:46:38
              64
              keyhei66
              电源币:61 | 积分:3 主题帖:1 | 回复帖:10
              LV2
              班长
              这个计算频率还是非常实用的
              2019/11/17 08:45:14
              67
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              在单片机编程中经常用
              2019/11/24 16:53:19
              68
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              这只是其中一种计算方法,比较常用
              2019/11/24 17:56:47
              75
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              105的单片机开发板不多见,我用103系列的单片机可以吗
              2019/11/24 21:30:01
              76
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              103系列的当然可以,
              2019/11/24 17:55:50
              74
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              多功能小车,网上有好多这的,但是这种带视频监控的不多见,有空也做一个
              2019/11/24 21:31:52
              77
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              其他舵机等??槎祭嗨?,主要视频传输???
              2019/11/30 13:55:12
              78
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

                    大赛马上结束,简单把程序这块介绍下,主要是串口通信

                    最简单的串口数据处理机制是数据接收并原样回发的机制是:成功接收到一个数,触发进入中断,在中断函数中将数据读取出来,然后立即。这一种数据处理机制是“非缓冲中断方式”,虽然这种数据处理方式不消耗时间,但是这种数据处理方式严重的缺点是:数据无缓冲区,如果先前接收的的数据如果尚未发送完成(处理完成),然后串口又接收到新的数据,新接收的数据就会把尚未处理的数据覆盖,从而导致“数据丢包”。

                   

                     对于“数据丢包”,最简单的办法就是使用一个数组来接收数据:每接收一个数据,数组下标偏移。虽然这样的做法能起到一定的“缓冲效果”,但是数组的空间得不到很好的利用,已处理的数据仍然会占据原有的数据空间,直到该数组“满载”(数组的每一个元素都保存了有效的数据),将整个数组的数据处理完成后,重新清零数组,才能开启新一轮的数据接收。

                     解决这个问题采用FIFO的机制,环形缓冲区就是一个带“头指针”和“尾指针”的数组?!巴分刚搿敝赶蚧沸位撼迩锌啥恋氖?,“尾指针”指向环形缓冲区中可写的缓冲空间。通过移动“头指针”和“尾指针”就可以实现缓冲区的数据读取和写入。

              2019/11/30 15:26:46
              79
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              1.图形和代码分析

                        当然,环形缓冲区的“头指针”和“尾指针”可以用“头变量”和“尾变量”来代替,因为切换数组的元素空间,除了可以用“指针偏移法”之外,还可以用“素组下标偏移法”。当串口接收到新的数组,则将数组保存到环形缓冲区中,同时将“尾变量”加一,以保存下一个数据;应用程序在读取数据时,“头变量”加一,以读取下一个数据。

              #define MAX_SIZE  12               //缓冲区大小

               

              typedef struct 

              {

                unsigned char head;        //缓冲区头部位置

                unsigned char tail;         //缓冲区尾部位置

                unsigned char ringBuf[MAX_SIZE]; //缓冲区数组

              } ringBuffer_t;

               

              ringBuffer_t buffer;                 //定义一个结构体

              2019/11/30 15:28:58
              80
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              2.定义一个结构头体则表示新的消息队列已经创建完成。新建创建的队列,头指针head和尾指针tail都是指向数组的元素0。如下图所示,此时的消息队列是“空队列”。

              当如果有11个数据abcdefghijk存入缓冲队列,则如下图所示:

                     当如果l加入队列,则缓冲队列处于满载状态,如下图所示:如果此时,接收到新的数据并需要保存,则tail需要归零,将接收到的数据存到数组的第一个元素空间,如果尚未读取缓冲数组的一个元素空间的数据,则此数据会被新接收的数据覆盖。同时head需要增加1,修改头节点偏移位置丢弃早期数据。

              2019/11/30 15:40:27
              81
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              3.读取缓冲队列中的11个数据后,状态如下:

              当消息队列中的所有数据都读取出来后,此时环形队列是空的,状态如下图所示。从图可以总结得知,如果tailhead相等,则表示缓冲队列是空的。

              2019/11/30 15:58:17
              82
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              我们看看程序中是怎么做的

              我们需要在主函数的超级循环里读取缓冲区数据,并判断解析数据就可以

              2019/12/01 19:23:43
              83
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              这是最终的成品图,带超声波避障功能

              2019/12/02 13:40:07
              84
              lihui710884923
              电源币:484 | 积分:1 主题帖:161 | 回复帖:526
              LV9
              军长
              这个FIFO在串口接受中应用广泛,不过也可以用DMA+空闲中断
              2019/12/02 21:14:46
              85
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              下次可以采用DMA的方法试试咋样
              2019/12/03 22:24:55
              86
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              你好,我也在学习环形队列这块,如何删除队列的数据呢,对串口接受超时做判断?
              2019/12/05 22:17:25
              87
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长
              删除的话,直接覆盖数据就可以了,超时判断的话更好了
              2019/12/06 11:41:03
              88
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              最终的产品功能视频演示,整体功能全部实现,视频实时监控

              1.电脑连接小车wifi,通过键盘的W A S D控制小车的前 左 后  右

              2.电脑控制舵机

              3.超声波避障

              4.手机APP控制


              2019/12/06 22:23:24
              89
              liuxiaofei126
              电源币:0 | 积分:0 主题帖:9 | 回复帖:84
              LV6
              团长

              这是电脑控制软件

              功能非常强大的,

              这是手机APP

              2019/12/06 22:43:30
              90
              heiha88
              电源币:1 | 积分:1 主题帖:5 | 回复帖:33
              LV4
              连长
              楼主这个小车是热点啊,其他设备连接这小车,并控制啊,明白了
              客服热线
              服务时间:周一至周五9:00-18:00
              微信关注
              免费技术研讨会
              获取一手干货分享

              互联网违法不良信息举报

              Reporting Internet Illegal and Bad Information
              editor@netbroad.com
              400-003-2006

              百度|中国纪委国家监委网站|北京纪检监察网|bitfinex注册 | bitfinex平台 | www.baidu.com-百度百科|

              健康遊戲忠告:抵制不良遊戲拒絕盜版遊戲注意自我保護謹防受騙上當適度遊戲益腦沉迷遊戲傷身合理安排時間享受健康生活

              備案號:皖B2-2334451本站www.ht9vf.cn所有