# SCMAndroidCommunicate
Android与51单片机的通信
## 前言
本篇文章将围绕App与单片机的蓝牙通信来说说lz最近进行开发的一些方案与思考
此文分为三部分:
- 单片机的PWM与串口通信
- Android的蓝牙开发
- 单片机与Android App的通信方案
## 预览
![这里写图片描述](https://raw.githubusercontent.com/whaoming/aboutme/master/image/%E5%B0%8F%E8%BD%A6%E6%88%AA%E5%B1%8F.BMP)
![这里写图片描述](https://raw.githubusercontent.com/whaoming/aboutme/master/image/led%E6%88%AA%E5%B1%8F.BMP)
视频观看:
> http://v.youku.com/v_show/id_XMjQ5MTgyMTAwMA==.html
## 环境
### 单片机
- 单片机:STC89C52
- c语言
- 编写环境:Keil uVision4
- 烧录:stc-isp-15xx-v6.82
### Android
- android sdk 16+
- Android studio 1.0+
## 单片机的PWM与串口通信
### PWM
我相信PWM的概念大家都应该,如果还很模糊也可以去查查,可以看看这篇文章
> http://www.eepw.com.cn/article/275890.htm
那么我们这里要说的,就是怎么通过程序去模拟pwm信号(有些单片机自带pwm处理,就无需写程序),从程序的方面讲,我们要模拟PWM,就是让高电平持续一小段时间,然后再让低电平持续一段时间,也就是改变占空比。
那么再单片机中,这种关于频率的事情一般都是通过定时器来实现的,那么我的方案是这样的:
**设置一个全局变量t,PWM_T,每当定时器中断的时候使t自增1,当t等于100的时候,使之高电平,并让t等于0,当t等于PWM_T的时候,使之低电平,这样,我们就可以通过改变PWM_T的值来改变占空比,从而实现通过目标的电压,使之达到调节的效果(例如调节led灯的亮度,调节电机的速度等)**
```
/****************************************************
定时器0中断模拟PWM
调节led的亮度
****************************************************/
int t = 0;
int PWM_T = 0; //占空比控制变
void main()
{
TMOD = 0x22; //定时器0,工作模式2,8位定时模式
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
P1=0xff; //初始化P1,输出端口
PWM_T=30;
while(1)
{
if(!up) //当up按键按下的时候
{
if(PWM_T<100)
{
PWM_T+=1;
}
delay_1ms(20);
}
if(!down) //当down按键按下的时候
{
if(PWM_T>0)
{
PWM_T-=1;
}
delay_1ms(20);
}
}
}
timer0() interrupt 1
{
t++; //每次定时器溢出加1
if(t==100) //PWM周期 100个单位
{
t=0; //使t=0,开始新的PWM周期
P1=0x00; //输出端口,使之低电平
}
if(PWM_T==t) //按照当前占空比切换输出为高电平
{
P1=0xff; //输出端口,使之高电平
}
}
```
### 串口通信
上面我们说了PWM调速,那么要达到app实时显示速度,就必须要单片机把速度传输给手机(在这里先用占空比模拟实时速度,道理是一样的,春节快递停了,测速模块还没到),那么我的首选方案肯定是单片机通过蓝牙串口发送给app,app接收并进行显示,这里我的蓝牙模块是hc-06。串口通信很容易,但在这个过程中我发现难的地方是数据格式的定义和数据的解析,也就是说要统一使用16进制,还是10进制,数据的头节点和尾节点的定义,或者说数据每一位所代表的参数,在这里先埋个伏笔,文章的后面会对我自己的方案进行介绍.
## Android蓝牙开发
那么android为我们提供的关于蓝牙的api其实已经很强大了,通常的步骤为:
1. 打开蓝牙
2. 搜索蓝牙设备
3. 进行配对
4. 连接
5. 数据的发送与接收
### 开启蓝牙
```
private BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
/**
* 打开蓝牙
*/
public static void openBluetooth(@NonNull Activity activity) {
if (INSTANCE.bluetoothAdapter == null) {
// 设备不支持蓝牙
Toast.makeText(INSTANCE.context.getApplicationContext(), "您的设备似乎不支持蓝牙", Toast.LENGTH_SHORT).show();
return;
}
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(enableBtIntent, 6);
}
/**
* 关闭蓝牙
*/
public static void closeBluetooth() {
if (INSTANCE.bluetoothAdapter != null) {
INSTANCE.bluetoothAdapter.disable();
}
}
/**
* 判断蓝牙是否打开
* @return boolean 蓝牙是否打开
*/
public static boolean isBluetoothOpen() {
return INSTANCE.bluetoothAdapter != null && INSTANCE.bluetoothAdapter.isEnabled();
}
```
### 搜索附近的蓝牙设备
那么搜索蓝牙设备当然也是调用系统的api即可,然后系统通过广播接收者的方式告诉你,我找到设备了,下面po出代码
```
/**
* 搜索蓝牙设备
*/
public static void searchDevices() {
INSTANCE.bluetoothDevices.clear();
if (INSTANCE.bluetoothAdapter != null) {
// 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
INSTANCE.bluetoothAdapter.startDiscovery();
}
}
```
下面是所要接收的广播
```
/**
* 初始化过滤器
*/
private void initIntentFilter() {
// 设置广播信息过滤
IntentFilter intentFilter = new IntentFilter();
//搜索到设备
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
//蓝牙状态改变
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
//绑定状态改变
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
// 注册广播接收器,接收并处理搜索结果
registerReceiver(receiver, intentFilter);
}
```
那么当接收到广播的时候,只需调用BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)就可以取出对应的搜索的蓝牙设备
### 蓝牙配对
```
/**
* 绑定设备
*
* @param device BluetoothDevice对象
* @return 是否绑定成功
*/
public static boolean bondDevice(BluetoothDevice device) {
if (INSTANCE.bluetoothAdapter == null) {
return false;
}
// 取消蓝牙设备搜索
INSTANCE.bluetoothAdapter.cancelDiscovery();
try {
if (device.getBondState() == BluetoothDevice.BOND_NONE) {
// 设备未配对,进行配对操作
Method method = BluetoothDevice.class.getMethod("createBond");
method.invoke(device);
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
```
### 蓝牙连接
```
BluetoothSocket socket;
//获取一个uuid值
UUID uuid = uuidCandidates.get(candidate++);
//根据android不同sdk调用不同的api
if (secure) {
socket= device.createRfcommSocketToServiceRecord(uuid);
} else {
socket= device.createInsecureRfcommSocketToServiceRecord(uuid);
}
```
### 数据的发送与接收
参考了网上很多关于蓝牙数据通信的做法,好多都是每发送一次数据都关闭socket,但是那样我觉得并不好,因为socket的开启与关闭都是比较耗费资源的,那么我的方案是开启一个线程保持socket连接进行蓝牙数据的接收与发送。
```
public class TouchMsgThread extends Thread {
private BluetoothSocket socket;
private InputStream inputStream;
private OutputStream outputStream;
private Handler handler;
public TouchMsgThread(BluetoothSocket socket, Handler handler) {
this.socket = socket;
InputStream input = null;
没有合适的资源?快使用搜索试试~ 我知道了~
Android与51单片机的信息交互.zip
共113个文件
xml:46个
java:33个
png:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 85 浏览量
2023-10-25
22:46:30
上传
评论
收藏 233KB ZIP 举报
温馨提示
matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行!
资源推荐
资源详情
资源评论
收起资源包目录
Android与51单片机的信息交互.zip (113个子文件)
gradlew.bat 2KB
main.c 1KB
.gitattributes 378B
.gitignore 1KB
.gitignore 7B
.gitignore 7B
build.gradle 2KB
build.gradle 922B
build.gradle 644B
settings.gradle 32B
gradlew 5KB
HJ-4WD_PWM.h 4KB
HJ-4WD.h 4KB
pwm调节小车速度.hex 6KB
gradle-wrapper.jar 52KB
Speedometer.java 63KB
BleUtil.java 12KB
BoundActivity.java 10KB
RaySpeedometer.java 9KB
PointerSpeedometer.java 9KB
Note.java 8KB
AwesomeSpeedometer.java 8KB
DeluxeSpeedView.java 7KB
BluetoothHelper.java 7KB
BluetoothConnector.java 6KB
ImageSpeedometer.java 5KB
TubeSpeedometer.java 5KB
Indicator.java 5KB
RunActivity.java 5KB
ImageIndicator.java 4KB
SpeedView.java 4KB
TouchMsgThread.java 3KB
TextNote.java 3KB
ImageNote.java 3KB
BluetoothDeviceAdapter.java 2KB
TriangleIndicator.java 2KB
RunActivity2.java 2KB
NormalSmallIndicator.java 2KB
NormalIndicator.java 2KB
LineIndicator.java 2KB
SpindleIndicator.java 2KB
HomeActivity.java 1KB
ExampleInstrumentedTest.java 766B
OnSpeedChangeListener.java 699B
NoIndicator.java 676B
OnSectionChangeListener.java 546B
ExampleUnitTest.java 409B
ApplicationTest.java 361B
pwm调节小车速度.lnp 34B
main.LST 5KB
pwm调节小车速度.M51 16KB
README.md 11KB
ss.md 37B
main.OBJ 13KB
pwm调节小车速度.plg 20KB
ic_launcher.png 10KB
ic_launcher.png 8KB
ic_launcher.png 5KB
ic_launcher.png 3KB
ic_launcher.png 2KB
proguard-rules.pro 650B
proguard-rules.pro 645B
gradle.properties 730B
gradle-wrapper.properties 233B
pwm调节小车速度 14KB
pwm调节小车速度.uvopt 54KB
pwm调节小车速度.uvproj 13KB
workspace.xml 224KB
attrs.xml 5KB
activity_run2.xml 3KB
misc.xml 3KB
activity_run.xml 2KB
activity_main.xml 2KB
AndroidManifest.xml 976B
item_bluetooth_device.xml 846B
support_media_compat_25_1_0.xml 800B
activity_home.xml 796B
support_core_utils_25_1_0.xml 788B
support_fragment_25_1_0.xml 776B
gradle.xml 771B
support_core_ui_25_1_0.xml 770B
support_compat_25_1_0.xml 764B
appcompat_v7_25_1_0.xml 752B
runner_0_5.xml 718B
rules_0_5.xml 712B
exposed_instrumentation_api_publish_0_5.xml 694B
compiler.xml 686B
espresso_idling_resource_2_2_2.xml 676B
animated_vector_drawable_25_1_0.xml 639B
support_vector_drawable_25_1_0.xml 634B
espresso_core_2_2_2.xml 621B
runConfigurations.xml 564B
javax_annotation_api_1_2.xml 559B
hamcrest_integration_1_3.xml 551B
hamcrest_library_1_3.xml 530B
hamcrest_core_1_3.xml 516B
javawriter_2_1_1.xml 511B
javax_inject_1.xml 501B
modules.xml 496B
support_annotations_25_1_0.xml 495B
共 113 条
- 1
- 2
资源评论
天天501
- 粉丝: 605
- 资源: 4666
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功