电脑制作网站用哪个软件,在线拼接图片,php做网站导购,国内能用的搜索引擎文章目录 前言一、HC05蓝牙模块1.HC05概述2.HC05的连接图3.进入HC05的命令模式4.常用的AT指令4.1 检查AT是否上线4.2 重启模块4.3 获取软件版本号4.4 恢复默认状态4.5 获取蓝牙的名称4.6 设置蓝牙模块的波特率4.7 查询蓝牙的连接模式4.8 查询模块角色 5.连接电脑6.通过HC05发送… 文章目录 前言一、HC05蓝牙模块1.HC05概述2.HC05的连接图3.进入HC05的命令模式4.常用的AT指令4.1 检查AT是否上线4.2 重启模块4.3 获取软件版本号4.4 恢复默认状态4.5 获取蓝牙的名称4.6 设置蓝牙模块的波特率4.7 查询蓝牙的连接模式4.8 查询模块角色 5.连接电脑6.通过HC05发送消息7.stm32完整代码 二、香橙派串口通讯1.打开串口设备2.接线3.串口函数3.1 打开串口文件3.2 关闭串口文件3.3 发送一个字符3.4 发送一个规定好的字符串3.5 printf3.6 返回等待读取的字符数3.7 读取字符3.8 缓冲区函数 4.输出内容5.接收内容6.接收字符串 三、使用hc05连接香橙派1.通过蓝牙发送字符串给手机2.手机发送内容给香橙派 总结 前言
隔了这么久我准备再玩一下香橙派最近这段时间还是比较的忙我搭建了个论坛和博客经常被网络攻击所以我也是一直在弄网络去了然后今天比较空闲就想着把单子做一下这个单子需要使用到HC05蓝牙模块所以我准备写一篇博客来使用香橙派控制HC05蓝牙模块。
一、HC05蓝牙模块
这个模块是非常经典的一个蓝牙模块我之前有一单也是使用到这个模块可以看一下我的这个视频【作息控制系统使用说明】这个项目也是使用到蓝牙模块的只不过当时时间紧任务重所以就没有写一篇博客来好好记录一下这个项目等后面我会单独拿一个模块来介绍一下我做的这些小项目。
1.HC05概述
HC05是嵌入式蓝牙串口通讯模块也就是使用串口就可以和HC05进行通讯并发送信息给蓝牙的接收端这个模块有两种工作方式
1 命令响应工作模式
2 自动连接工作模式
在自动连接的工作模式下又可以分为主、从、回环这三种模式当传输数据时根据事先设定的方式连接并传输数据。
在命令模式下用户可以使用串口连接模块并发送AT指令对模块进行设置。
2.HC05的连接图
这里我直接使用TTL to USB进行连接因为我要设置一下这个模块的一些传输和内容。 这里和串口连接的模式一样
HC05TTL3.3VCCTXDRXDRXDTXDGNDGND
3.进入HC05的命令模式
首先我们需要通过AT指令来设置模块的一些内容然后我们才好进入下面的一些操作首先在这个模块上有一个按钮 在上电之前需要长按这个按键然后再上电就可以进入命令模式在进入命令模式后模块上的LED等会缓慢的闪烁如果没有进入就会闪得很快。
4.常用的AT指令
AT指令列表已经烂大街了所以这里不全部说明我只拿出一些常用的来说明即可。
4.1 检查AT是否上线
AT\r\n如果模块在就会返回OK 4.2 重启模块
ATRESET\r\n如果执行成功就会返回OK并进入自动连接模式 4.3 获取软件版本号
AT_VERSION?\r\n执行完成后会返回版本信息和OK 4.4 恢复默认状态
ATORGL\r\n执行完成后会返回OK并将模块恢复为出厂设置。
4.5 获取蓝牙的名称
ATNAME?\r\n执行完成后会返回蓝牙名称并返回OK 4.6 设置蓝牙模块的波特率
ATUART波特率,停止位,校验位\r\n这里我们设置一个比较常见的波特率9600停止位1位无校验位
ATUART9600,1,0这样就可以了。
4.7 查询蓝牙的连接模式
ATCMODE?\r\n返回当前模式1代表任意模式也就是蓝牙名称和蓝牙地址都可以连接这里就不多说了一般默认是1就可以了。
4.8 查询模块角色
ATROLE?这里默认的是Slave从角色也就是被动连接不用动。
5.连接电脑
这里我踩了个大坑因为我之前的设置是将波特率改为9600了所以在串口的时候我就用9600进行连接结果没有任何的反应后面查了一下手册才发现它默认的波特率是38400就很尴尬。
这里连接好电脑后先发送个AT指令来查看一下是否返回OK如果没返回有可能是因为坏了或者是你没长按按键进入命令模式。
然后修改一下波特率因为我们后面初始化串口不想给那么大的波特率 初始化完成后要记得重启一下模块然后模块的波特率就设置好看但是AT指令模式下还是那个波特率又踩坑了当不想改文章。
6.通过HC05发送消息
这里我先用stm32来演示因为我还在做单子所以先拿这个演示。
首先先写串口的初始化函数这里我使用的是USART1初始化代码就不展示了因为今天的主题不是stm32然后在main函数中我们使用重写的printf来通过串口发送数据。不知道的可以看我这篇博客异步通讯点灯。
int main(){OLED_Init();MX_Init_KEY();MX_Init_HC05();while(1){printf(hello\r\n);OLED_ShowString(1, 1, hello);}
}然后需要在手机上下载蓝牙调试宝在应用商城都可以下载这我就不给你们压缩包了要不然我老喜欢挂码。
首先要把蓝牙模块连接到面包板上然后就用手机连接好蓝牙 记住串口反接并且要接地即可。
然后打开蓝牙助手的界面 找到里面有一个HC-05然后连接即可第一次连接需要你输入一个配对码这里输入1234或者0000都可以 然后给单片机上电后就会显示出hello来 学到这你已经会使用蓝牙进行发送信息了stm32就先不再出现了后面就是香橙派的内容了。
7.stm32完整代码
usart.c
#include hc05.hvoid MX_Init_HC05(){GPIO_InitTypeDef GPIO_InitStruct {0};USART_InitTypeDef USART_InitStruct {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin GPIO_Pin_10;GPIO_Init(GPIOA, GPIO_InitStruct);USART_InitStruct.USART_BaudRate 9600;USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None;USART_InitStruct.USART_Mode USART_Mode_Rx | USART_Mode_Tx;USART_InitStruct.USART_Parity USART_Parity_No;USART_InitStruct.USART_StopBits USART_StopBits_1;USART_InitStruct.USART_WordLength USART_WordLength_8b;USART_Init(USART1, USART_InitStruct);USART_Cmd(USART1, ENABLE);
}int fputc(int ch, FILE *f)
{ while((USART1-SR0X40)0); USART1-DR (u8) ch; return ch;
}
二、香橙派串口通讯
在介绍使用香橙派使用HC05模块前先介绍一下串口通讯并如何配置串口通讯。
1.打开串口设备
在香橙派中串口通讯是使用设备来进行传输的 所以我们需要在系统设置中将串口进行打开。
在打开之前先了解一下香橙派的串口引脚分布 在3b中有3个串口可供选择然后通过
sudo orangepi-config来开启设备进入到设置页面 然后选择第一个按一下回车即可然后在下面的页面中选择Hardware 然后找到你要开启的串口 我这选择的是UART7使用方向键移动到那后按一下空格就选中然后按一下回车保存之后会提示是否重启然后按一下回车就可以重启了。
重启完成后使用
ls /dev/ ttyS*来查看可操作的设备文件这里只会显示你开启的设备 我们刚才选择了UART7后它这里就会有相应的设备那个ttyS1是默认开启的我们不用理他。
2.接线
这里就需要非常非常注意了我在测试的时候就是这里没有弄好线接反了导致一直发送不了。
按照前面给的那张图进行接线后我们就可以写代码了。
注意这里很重要很多人玩51单片机来玩这个会忽略一个问题就是GND必须要和单片机的GND接在一起很多人会单独给这个引脚接GND是错误的。
3.串口函数
这里使用的串口函数库是
#include wiringSerial.h3.1 打开串口文件
int serialOpen(const char* path, int butrl);第一个参数是设备的路径比如说我们这需要使用到UART1那设备地址就是/dev/ttyS7。
第二个参数是波特率比如9600。
这个函数的返回值是一个文件描述符我们使用一个变量来接收就可以了。
3.2 关闭串口文件
void serialClose(int fd);参数是打开的设备描述符。
3.3 发送一个字符
void serialPutchar(int fd, char c);将一个字符发送到打开的文件描述符fd所对应的设备文件。
3.4 发送一个规定好的字符串
void serialPuts(int fd, char* s);发送一个规定好的字符串然后以0结尾。
3.5 printf
void serialPrintf(int fd, char* message, ...);这个和printf的用法类似。
3.6 返回等待读取的字符数
int serialDataAvail(int fd);返回的是等待读取的字符数。
3.7 读取字符
int serialGetChar(int fd);返回下一个待读取的字符如果这个在10s内没有读取到字符就会返回-1。
3.8 缓冲区函数
void serialFlush(int fd);抛弃所有接收的数据或者等待写入设备完成。
4.输出内容
通过学习了上面的内容后我们可以简单写一个输出字符的代码来输出0~9
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main(){int fd -1, i;wiringPiSetup();fd serialOpen(/dev/ttyS7, 9600); // 设置串口设备和波特率if (fd 0){// 设备打开失败printf(设备打开失败\n);return -1;}serialFlush(fd);for (i 0; i 10; i){serialPutchar(fd, i 0);}serialClose(fd); // 关闭设备
}运行效果如下 然后也可以使用printf来个高级一点的输出
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main(){int fd -1, i;wiringPiSetup();fd serialOpen(/dev/ttyS7, 9600); // 设置串口设备和波特率if (fd 0){// 设备打开失败printf(设备打开失败\n);return -1;}serialFlush(fd);for (i 0; i 10; i){serialPrintf(fd, this is%d\r\n, i);}serialClose(fd); // 关闭设备
}输出的内容如下 5.接收内容
我们可以通过串口来接收一下用户输入的内容并判断输入的字符是不是我们需要的然后通过串口返回
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main(){int fd -1, i;int c;wiringPiSetup();fd serialOpen(/dev/ttyS7, 9600); // 设置串口设备和波特率if (fd 0){// 设备打开失败printf(设备打开失败\n);return -1;}serialFlush(fd);while(1){c serialGetchar(fd);if (c -1){break;}if (c 1){serialPrintf(fd, this is 1);}printf(%c, c);}serialClose(fd); // 关闭设备
}输出的内容 这里大家可以看到我在这个while循环中添加了一个printf但是没有截屏给出效果是因为在这个串口运行的过程中一直在读取的是串口的设备没有使用输入输出流设备所以导致我们在输入后没办法显示出内容来这个的解决办法我还不太清楚等我研究好了我在出一篇文章来介绍。
6.接收字符串
做串口最让人沉醉的就是读取字符串的操作了,在wiringSerial中有一个函数可以获取缓冲区的长度我们可以判断这个来读取输入的数据的长度然后使用一个for循环来循环读取和放置在一个数组中之后进行输出即可代码如下
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main(){int fd -1;int i, ch, j 0, len;char str[1024];wiringPiSetup();fd serialOpen(/dev/ttyS7, 9600);if (fd 0){printf(打开设备文件失败\n);return -1;}while(1){len serialDataAvail(fd); // 获取缓冲区的长度if (len -1){// 超时退出循环break;}else if(len 0){serialPrintf(fd, %d\n, len); // 这一行是测试的for (i 0; i len; i){ch serialGetchar(fd); // 读取字符str[j] ch;}break;}}str[j] \0;printf(%s\n, str);serialClose(fd);return 0;
}三、使用hc05连接香橙派
学会了上面的操作后我们就可以来用香橙派连接hc05了这个操作也非常非常的简单和单片机的连接一致注意不要连错就行了。 1.通过蓝牙发送字符串给手机
本质的思路还是一样的就是使用串口是输入输出就可以搞定代码如下
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main(){int fd -1, i;int c;wiringPiSetup();fd serialOpen(/dev/ttyS7, 9600); // 设置串口设备和波特率if (fd 0){// 设备打开失败printf(设备打开失败\n);return -1;}serialFlush(fd);while(1){serialPrintf(fd, hello\r\n);delayMicroseconds(30000); // 延时函数免得发送得过快}serialClose(fd); // 关闭设备
}然后在调试助手中就可以看到蓝牙模块发送的内容了 2.手机发送内容给香橙派
这里可以使用刚才我们测试的接收字符串只不过这里有一个问题就是这个工具只能发送字符所对应的ascii码不能正常的输入字符进行输出。
比如我们手机输入字符0那就得输入ascii码的30 然后在香橙派中就会显示 然后我们还可以用这个来输入0~9 然后显示 学会了这个后我们就可以编写一个用蓝牙点灯的程序了其实就是使用蓝牙接收到关键字后给LED灯高低电平这里就直接给代码了不展示图片了
#include stdio.h
#include wiringPi.h
#include wiringSerial.h
#include string.hint main(){int fd -1;int i, ch, j 0, len;char str[1024];wiringPiSetup();fd serialOpen(/dev/ttyS7, 9600);if (fd 0){printf(打开设备文件失败\n);return -1;}while(1){len serialDataAvail(fd);if (len -1){break;}else if(len 0){serialPrintf(fd, %d\n, len);for (i 0; i len; i){ch serialGetchar(fd);str[j] ch;}break;}}str[j] \0;printf(%s\n, str);if (strcmp(str, 0)){// 点灯}else{// 灭灯}serialClose(fd);return 0;
}
总结
串口很好玩蓝牙模块也好玩学会了这一节我们就可以使用蓝牙做一个简单的远程开关灯的项目了当然拿香橙派做这个项目就很浪费毕竟香橙派可以直接使用网络来实现做一个网页然后内网穿透这样可以很容易的在远程进行控制了等我最近忙完有时间我做一个。
大家可以关注一下我的论坛和博客有不懂的或者有趣的问题可以放在我的论坛中进行提问
马桶论坛
马桶博客