将16进制的字符串转换成bytes,通过hexstring2bytes转换,从而发送指令。
一、需要发送64个字节的数组,如果一次性发送过去,单片机那里可能无法及时处理以致没有任何回应,因为单片机那里是设置了数据接收的延时时间。要想畅通的与蓝牙模块通信,考虑这个时间差非常重要。调整字节的发送速率,就成为非常关键的一步。
二、值得注意的是,数据的发送是非常快的,就是因为这样才会导致单片机那里无法及时处理,所以,每次发送后的延时是非常重要的。我们单片机那里的延时是10毫秒,所以我们选择发送完每个字节后就延时10毫秒再发下个字节。
三、在使用InputStream的时候,必须注意,InputStream的读取是阻塞的。这点在一般的情况下是不会影响到我们的程序,但是记住这个情况对于代码的设计是非常重要的。
四、无参数的read()是每次只从流中读取一个字节,这种做法效率非常低,但是简单,像是读取整数值这种情况,使用read()就非常好,但如果是16进制字符串,使用InputStream.read(byte[]
b)或者InputStream.read(byte[] b,int off,int len)方法,这样一次就能读取多个字节。
将16进制的字符串转换成bytes,通过hexstring2bytes转换而不能直接用getbytesString string = "41542B50494F392C310D"
mmOutStream.write(string.getBytes())
读取inputsteam中的
?
Log.d("example", "do read")
不执行,完整代码如下:
?
/**
* This thread runs during a connection with a remote device. It handles all
* incoming and outgoing transmissions.
*/
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket
private final InputStream mmInStream
private final OutputStream mmOutStream
public ConnectedThread(BluetoothSocket socket, String socketType) {
Log.d(TAG, "create ConnectedThread: " + socketType)
mmSocket = socket
InputStream tmpIn = null
OutputStream tmpOut = null
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream()
tmpOut = socket.getOutputStream()
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e)
}
mmInStream = tmpIn
mmOutStream = tmpOut
}
public void run() {
Log.i(TAG, "BEGIN mConnectedThread")
byte[] buffer = new byte[1024]
int bytes
// Keep listening to the InputStream while connected
while (true) {
Log.d("example", "do read")
try {
// Read from the InputStream
bytes = mmInStream.read(buffer)
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes,
-1, buffer).sendToTarget()
} catch (IOException e) {
Log.e(TAG, "disconnected", e)
connectionLost()
// Start the service over to restart listening mode
BluetoothChatService.this.start()
break
}
}
}
/**
* Write to the connected OutStream.
*
* @param buffer
*The bytes to write
*/
public void write(byte[] buffer) {
String string = "41542B50494F392C310D"
try {
mmOutStream.write(string.getBytes())
// Share the sent message back to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1,
buffer).sendToTarget()
} catch (IOException e) {
Log.e(TAG, "Exception during write", e)
}
}
public void cancel() {
try {
mmSocket.close()
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e)
}
}
}
使用AT指令的时候,先使蓝牙模块进入AT模式,然后你就当蓝牙就是命令的接收端,单片机或者PC串口就是命令的发送端(就当蓝牙是独立的模块)。串口发送的AT数据是直接给蓝牙模块的,这个串口可以是PC串口也可以是单片机串口。
如果你想用单片机实现AT指令设置蓝牙,就用一个IO控制蓝牙模块的KEY管脚,把AT指令写在程序中,通过串口发送给蓝牙模块。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)