嵌入式人工智能(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 数据库系统,基于…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
