嵌入式人工智能(41-基于树莓派4B的串口蓝牙模块AT09-cc2541)
1、串口蓝牙模块AT-09
AT-09是一种串口蓝牙模块,可实现串口与蓝牙之间的数据传输。AT-09模块基于蓝牙4.0技术,具有低功耗、高传输速率和广泛的应用范围。
AT-09模块支持AT指令,通过串口与外部设备进行通信。用户可以使用AT指令对模块进行配置和控制,例如设置蓝牙名称、密码、通信速率等。通过串口,用户可以与AT-09模块进行数据传输,实现与蓝牙设备的无线通信。
AT-09模块通常用于无线传输、数据采集等应用场景。它可以与各种主控板和设备进行连接,如Arduino、Raspberry Pi等。通过AT-09模块,用户可以方便地将串口设备无线化,实现无线控制和数据传输。
有了这个串口蓝牙模块,我们就可以用手机远程控制很多物联网设备了。有了通信网,整个世界都变得更加丰富多彩了。
2、蓝牙cc2541模块
串口蓝牙模块所用的蓝牙芯片是CC2541,而真正的无线通信是靠CC2541收发数据。串口仅仅是用来将无线收发的数据通过串口送开发板微处理器。
CC2541是一款针对低能耗以及私有2.4GHz应用的功率优化的真正片载系统(SoC)解决方案。它使得使用低总体物料清单成本建立强健网络节点成为可能。CC2541将领先RF收发器的出色性能和一个业界标准的增强型8051MCU、系统内可编程闪存存储器、8kBRAM和很多其它功能强大的特性和外设组合在一起。CC2541非常适合应用于需要超低能耗的系统。
通过下图可以看出真正片载系统Soc即串口底板+片上蓝牙模块。具体的原理,内部结构,功能,引脚等等请看数据手册把。
通过USB-TTL与电脑或者开发板连接,与电脑的连接可以参考我这个专栏的语音模块syn6288那一部分。
我们这里还是介绍与树莓派的接线,引脚引出线只有4根,这样就好接线了,VCC接开发板5V,GND接地,TXD接开发板的RXD0(BOARD10),RXD接开发板的TXD0(BOARD8)
3、手机蓝牙助手连接CC2541
这个部分最简单,但是也最重要,因为手机上要有应用程序和蓝牙模块建立连接。手机上的蓝牙应用程序可不是C或Python写的,具体我们也不要管它了,我们下载一个别人写好的能用的蓝牙助手,安卓手机安装包的名称为HCbluetooth.apk。然后将蓝牙模块也插上电,上电后蓝牙模块的指示灯不停闪烁。
在手机上找到刚刚安装的HC蓝牙助手,点击打开,打开后搜索到该模块,点击连接就OK了。
连接上之后,蓝牙模块的灯就不会闪了,一直亮着,然后把这几个模块都看看。
这个发送速度就设置为中就可以,经测试为波特率为9600,停止位1位,数据位8位,奇偶校验无,回头开发板的串口也设置为一样即可。
4、踩坑必看
本以为很简单的事情,运行程序后收到的数据不正常,或者收不到数据。耽误了大半天时间,经过我一顿思考和尝试,这里有个坑,同学们注意。如果你还没有运行程序,请先看第5部分。
(1)如果在运行程序出现:(提示权限问题,可以sudo chmod 666 /dev/ttyS0 暂时解决)
(3)手机HC蓝牙助手也出现这样的echo:
这些看似很多问题,可能是由于同一个问题导致的,就是蓝牙串口使用了ttyS0设备,该设备默认让用户通过串口登录,很久以前,windows有个超级终端的串口登录,估计同学们都不知道了,那已经是20多年前的事情了,以前都是都过串口登录到设备,做一些调试,比如路由器、交换机。该树莓派也是打开串口让用户登录。所以在通过蓝牙串口发送数据给树莓派时,开启了串口终端登录。我们到树莓派配置里面将这个功能给关闭。
点击OK后重启。估计就不会出现上述问题了。
4、实验代码与现象
有了这个模块我们就可以发送数据给开发板了,比如打开第1个灯,关闭第1个灯;或者开1,关1;总之python语言中对字符串的处理是非常方便的。只要包含开关这两个字就知道状态给0还是1;然后再从字符串中提取数字,把这个值赋值给变量即可。我这边为了节省IO口,仍然用TM1638扩展板做,如果同学们没有就直接放2个LED实现效果即可。
iimport serial
import TM1638
import time
import redef init():global tmtm=TM1638.TM1638(stb=36,clk=38,dio=40) tm.brightness(2)DEVICE = "/dev/ttyS0"global serser=serial.Serial(DEVICE,baudrate=9600,bytesize=8,parity="N",stopbits=1,timeout=0.1)def main_loop():while True:if ser.in_waiting > 0:# 读取串口数据data = ser.readall().decode('utf-8').strip()print("收到的数据:", data)if '开' in data:status = 1elif '关' in data:status = 0elif data=='结束程序':breakelse:ser.write(bytes('没有给出正确的指令','utf-8')) firstnum = re.search(r'\d',data)if firstnum:first_number = firstnum.group() if int(first_number)>0 and int(first_number)<=8:tm.led(int(first_number)-1,status) else:ser.write(bytes('没有给出正确的LED号码(1-8)','utf-8'))if __name__ == '__main__':init()try:main_loop()except KeyboardInterrupt:print("程序结束!")finally:tm.clear()ser.close()
程序解释:
(1)程序代码没有多少行,这就体现了Python语言的精练,同样的代码用C来写你试试把。可能有同学觉得树莓派毕竟是一台口袋电脑,用来做物联网成本有点高,而低成本的处理器可能不支持python。我这里有个想法,但是还没有考虑成熟,等我把树莓派栏目写完,我打算用ESP32或ESP8266做MicroPython的实验或项目,看看MicroPython在物联网上面和C的性能差距有多少。
(2)串口设置,不管有些参数是不是默认值,还是将波特率、数据位、停止位、奇偶校验都设置下。ser=serial.Serial(DEVICE,baudrate=9600,bytesize=8,parity="N",stopbits=1,timeout=0.1)
串口通信超时解决方案在进行串口通信时,可能会遇到以下两个问题:a读取串口数据时阻塞时间过长,造成程序无法及时响应。b进行写操作时,设备没有及时响应。
为了解决这些问题,我们可以使用Python的serial库提供的timeout参数来设置超时时间。timeout参数是一个浮点数,代表等待数据的最长时间(以秒为单位)。当没有数据可读时,等待超过指定的超时时间后,将触发超时异常。
(3)serial-三方库,提供了一系列的方法来处理串行通信。
in_waiting:返回输入缓冲区中的字节数。
if ser.in_waiting > 0:
# 读取串口数据
data = ser.readall().decode('utf-8').strip()
收到的数据都是以字节流的形式放到接收缓冲区,上面是正确的接收,我之前写的代码是
data = ser.readall()
if data:
text = data..decode('utf-8')
结果发现utf8编码的汉字被拆成3个字节,一个一个的print,python就没有办法解码了。
(4)输入相关指令对LED进行控制,可以先让程序发一段解释说明给手机,这样最好。
if '开' in data:status = 1elif '关' in data:status = 0elif 'help' in data:ser.write(bytes('请输入开/关 1-8的字样\n','utf-8')) elif data=='结束程序':breakelse:ser.write(bytes('没有给出正确的指令\n','utf-8'))
当然我这个程序if的嵌套逻辑结构不是最好的,如果业务逻辑比较丰富的话,可以参考模块化编程的思想和方法。
(5)指令包括2个参数,一个是第几个灯,一个是状态,所以状态通过开关来给定,第几个灯要从用户输入的内容里面提取数字再判断数字的有效范围。
从字符串里面提取第一个数字firstnum = re.search(r'\d',data)这里用到了正则表达式,需要导入re库,正则表达式是一种强大的文本处理工具,用于匹配、查找、替换复杂的文本模式。它由普通字符和特殊字符(元字符)组成,能够描述和匹配一系列符合特定规则的字符串。
相关文章:
嵌入式人工智能(41-基于树莓派4B的串口蓝牙模块AT09-cc2541)
1、串口蓝牙模块AT-09 AT-09是一种串口蓝牙模块,可实现串口与蓝牙之间的数据传输。AT-09模块基于蓝牙4.0技术,具有低功耗、高传输速率和广泛的应用范围。 AT-09模块支持AT指令,通过串口与外部设备进行通信。用户可以使用AT指令对模块进行配…...
C++ 动态规划
子序列子串相关 单个指一个数组或字符串,两个指两个数组或字符串。 最长上升子序列-单个 dp[i]:以下标i为结尾的递增的最长子序列长度。 位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 1 的最大值。 class Solution { public:int l…...
回溯问题总结
一、子集问题 模板问题 给定一个序列[1,n],求这个序列的所有子集 输入描述: 一个正整数n(1 < n < 12) 输出描述: 每个子集一行,输出所有子集。 输出顺序为: (1)元素个数少的子集优先输出;…...
GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库
使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍(不得不吐槽下,官方代码有很多遗留问题,他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上),经过了大量的查阅各种资料以…...
.net # 检查 带有pdf xss
1.解决pdf含javasprct脚本动作,这里是验证pdf内部事件。相关pdf文件下载: 测试pdf文件 相关包 iTextSharp 5.5.13.4 iTextSharp using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser;private Boolean IsPdfSafe(Stream stream){// PdfReader…...
【React】探讨className的正确使用方式
文章目录 一、className的正确用法二、常见错误解析三、实例解析四、错误分析与解决五、注意事项六、总结 在React开发中,正确使用className属性对组件进行样式设置至关重要。然而,由于JavaScript和JSX的特殊性,开发者常常会犯一些小错误&…...
打靶记录5——靶机hard_socnet2
靶机: https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标: 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...
独立站+TikTok达人:自主营销与创意内容的完美结合
在全球电商市场迅猛发展的今天,独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台,其自主性和灵活性为商家提供了广阔的发展空间;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础,成为推动销售…...
【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案
健康生活理念不断深入人心,多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展,启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案,旨在提升养生壶与茶吧机的用户体验与操…...
WAF绕过技术(PKAV团队)
目录 主流WAF的绕过技术 Web容器的特性 1. IIS+ASP的神奇% 2. IIS的Unicode编码字符 3. HPP(HTTP Parameter Pollution): HTTP参数污染 4. 畸形HTTP请求 Web应用层的问题 1. 多重编码问题 2. 多数据来源的问题 WAF自身的问题 1. 白名单机制 2. 数据获取方式存在缺陷…...
『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型
文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…...
python中的字符串方法
python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …...
python实现consul的服务注册与注销
我在使用consul的时候主要用于prometheus的consul服务发现,把数据库、虚拟机信息发布到consul,prometheus通过consul拿到数据库、虚拟机信息去采集指标信息。 此篇文章前提是已经安装好consul服务以后,安装consul请参考二进制方式部署consul…...
校园选课助手【2】-重要的登录模块
用户登录模块技术要点: 密码通过MD5加密传输分布式session存储用户登录信息自定义注解进行字段校验自定义拦截器完成登录验证 下面依次给出代码和详细解释: 1.使用 MD5 二次加密用户登录信息,前端先通过密码加上盐进行MD5加密交给服务器&a…...
4章2节:从排序到分组和筛选,通过 R 的 dplyr 扩展包来操作
dplyr是R语言中一个强大且高效的数据处理包,专门设计用于处理数据框(data frames)。它的语法简洁明了,操作高效,尤其适用于大数据集。dplyr提供了一系列函数,使得数据的筛选、变换、聚合和排序等操作变得简单直观。本文将详细介绍dplyr扩展包如何进行数据的排序到分组和筛…...
C语言实现 -- 单链表
C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前,我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1:移除…...
WSL和Windows建立TCP通信协议
1.windows配置 首先是windows端,启动TCP服务端,用来监听指定的端口号,其中IP地址可以设置为任意,否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据,其中…...
Android Gradle开发与应用(一):Gradle基础
文章目录 引言一、Gradle简介二、Gradle基础语法1. 项目结构2. 插件应用3. 仓库与依赖4. 任务(Tasks) 三、Gradle在Android项目中的深入应用1. 构建变体(Build Variants)2. 依赖管理3. 自定义构建逻辑 四、Gradle WrapperGradle W…...
Linux多线程服务器编程-1-线程安全的对象生命期管理
对象的生与死不能由对象自身拥有的mutex(互斥器)来保护. 如何避免对象析构时可能存在的race condition(竞态条件)是C多线程编程面临的基本问题。 对象的销毁可能出现多种竞态条件(race condition): 在即将析构…...
Couchbase 技术详解
文章目录 Couchbase 原理数据模型数据分布数据访问与同步官网链接 基础使用安装与配置数据操作 高级使用数据分片与负载均衡数据索引与查询安全性与权限管理 优点高性能可扩展性高可用性灵活性 总结 Couchbase 是一个高性能、分布式、可扩展的 NoSQL 数据库系统,基于…...
PTE-信息收集
一、渗透测试流程 渗透测试通常遵循以下六个基本步骤: 前期交互:与客户沟通,明确测试范围、目标、规则等。信息收集:搜集目标系统的相关信息。威胁建模:分析目标系统可能存在的安全威胁。漏洞分析:对收集…...
委外订单执行明细表增加二开字段
文章目录 委外订单执行明细表增加二开字段业务背景业务需求方案设计详细设计扩展《委外订单执行明细表》扩展《委外订单执行明细过滤》创建插件,并实现报表逻辑修改创建插件,添加引用创建类,继承原数据源类ROExecuteDetailRpt报表挂载插件 委…...
“数字孪生+大模型“:打造设施农业全场景数字化运营新范式
设施农业是一个高度复杂和精细化管理的行业,涉及环境控制、作物生长、病虫害防治、灌溉施肥等诸多环节。传统的人工管理模式已经难以应对日益增长的市场需求和管理挑战。智慧农业的兴起为设施农业带来了新的机遇。将前沿信息技术与农业生产深度融合,实现农业生产的数字化、网络…...
zeppline 连接flink 1.17报错
Caused by: java.io.IOException: More than 1 flink scala jar files: /BigData/run/zeppelin/interpreter/flink/zeppelin-flink-0.11.1-2.12.jar,/BigData/run/zeppelin/interpreter/flink/._zeppelin-flink-0.11.1-2.12.jar 解决方案: 重新编译zepplin代码&…...
【机器视觉】【目标检测】【面试】独家问题总结表格
简述anchor free和anchor boxanchor free是对gt实际的左上和右下的点做回归,anchor box是对辅助框即锚框做回归说说对锚框的理解锚框是辅助框, 可以通过预设的长宽比设定,也可以通过k-means算法聚类数据集得到目标检测的指标MAP,FLOPS,FPS,参数量简述非极大值抑制(NMS)非极大…...
从零开始,快速打造API:揭秘 Python 库toapi的神奇力量
在开发过程中,我们常常需要从不同的网站获取数据,有时候还需要将这些数据转化成API接口提供给前端使用。传统的方法可能需要大量的时间和精力去编写代码。但今天我要介绍一个神奇的Python库——toapi,它可以让你在几分钟内创建API接口&#x…...
如何理解复信号z的傅里叶变换在频率v<0的时候恒为0,是解析信号
考虑例子2.12.1的说法。 首先我尝试解释第二个说法。需要注意一个事实是 实函数f的傅里叶变换F的实部是偶函数,虚部是奇函数。如图所示: 注意的是这个图中虽然是离散傅里叶变换的性质,但是对于一般的傅里叶变换的性质是适用的。 推导过程如下…...
大型赛事5G室内无线网络保障方案
大型活动往往才是国家综合实力的重要体现,其无线网络通信保障工作需融合各类新兴的5G业务应用,是一项技术难度高、方案复杂度高的系统工程。尤其在活动人员复杂、现场突发情况多、网络不稳定等情况下,如何形成一套高效、稳定的应急通信解决方…...
windows 2012域服务SYSVOL复制异常
这边文章是我多年前在BBS提问的,后来有高手回答,我把他保存了下来,最近服务器出现问题,终于有翻出来了!发出来希望能帮到更多人。 问题 我的环境,windows 2012。最近改了一些域策略,发现没有正…...
动态规划,蒙特卡洛,TD,Qlearing,Sars,DQN,REINFORCE算法对比
动态规划(Dynamic Programming, DP)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划的步骤 识别子问题:定义问题的递归解法,识别状态和选择。确定DP数组:确定存储子问题解的数据结构ÿ…...
如何用图片做网站背景/百度投流运营
java中int和Integer的区别 一看就懂int 是基本类型,直接存数值integer是对象,用一个引用指向这个对象1.Java 中的数据类型分为基本数据类型和复杂数据类型int 是前者>>integer 是后者(也就是一个类)Integer 是对象类型 int是原始类型 适用场合有很…...
一般做网站多少钱/菏泽百度推广公司电话
在工程勘察设计企业高质量发展的大背景下,对人才的要求越来越高,很多企业希望通过传统的培训有效提升员工能力,实际上往往收效甚微。笔者认为一场有效的培训必须基于人员与岗位的匹配度,而匹配度确定的一个基础工作是岗位胜任力。…...
杭州网站建设icp备/南京百度推广开户
function filterRepat(arr){if(Array.isArray(arr) && arr.length){var arr arr.filter(function(val,index,carr){return carr.indexOf(val) index;});return arr;}return []; } 转载于:https://www.cnblogs.com/zhujiasheng/p/8447686.html...
天津做网站优化的公司/企业网站优化解决方案
mutation_data_tidy mutation_data_tidy PeRl 这次偶然课题需要用到突变相关数据,在这做一下简单的总结,抛砖引玉。 癌症相关数据最近都是从FIREHOSE上下载的,第一次发现突变数据并不是按照矩阵形式存储的,还需要自己整理清洗数据…...
O2O网站制作需要多少钱/长沙百度搜索排名优化
题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:2021年危险化学品生产单位安全生产管理人员考试题为正在备考危险化学品生产单位安全生产管理人员操作证的学员准备的理论考试专题,每个月更新的危险化学品生产单位安全…...
网站管理方案/投放广告
基本介绍 数据库、表、函数等 Hive 对象的定义存储在 Metastore 中。 根据系统的配置方式,统计数据和授权记录也可能存储在那里。 Hive 和其他执行引擎在运行时使用此数据来确定如何解析、授权和有效执行用户查询。 Metastore 通过 DataNucleus 将对象定义保存到关…...