Driver for the JY-MCU v1.06 HC-06 Bluetooth module.
Dependents: DISCO-F746NG_rtos_test MbedTableControl
HC06Bluetooth.cpp@8:14bf9b541f9a, 2016-06-16 (annotated)
- Committer:
- Electrotiger
- Date:
- Thu Jun 16 23:24:08 2016 +0000
- Revision:
- 8:14bf9b541f9a
- Parent:
- 6:5ba0038a7a9a
- Child:
- 9:3e23f3f615f2
Now tested. ; ; TODO: Ensure the setup function works when attempting to deal with different baud rates.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Electrotiger | 0:3ab5e47dde1e | 1 | /* |
Electrotiger | 0:3ab5e47dde1e | 2 | * HC06Bluetooth.cpp |
Electrotiger | 0:3ab5e47dde1e | 3 | * |
Electrotiger | 0:3ab5e47dde1e | 4 | * Created on: Jun 4, 2016 |
Electrotiger | 0:3ab5e47dde1e | 5 | * Author: Developer |
Electrotiger | 0:3ab5e47dde1e | 6 | */ |
Electrotiger | 0:3ab5e47dde1e | 7 | |
Electrotiger | 0:3ab5e47dde1e | 8 | #include <HC06Bluetooth.hpp> |
Electrotiger | 1:026034717620 | 9 | #include <algorithm> |
Electrotiger | 0:3ab5e47dde1e | 10 | |
Electrotiger | 8:14bf9b541f9a | 11 | |
Electrotiger | 8:14bf9b541f9a | 12 | |
Electrotiger | 8:14bf9b541f9a | 13 | HC06Bluetooth::HC06Bluetooth(PinName TX, PinName RX, void (*lineCallbackFunc) (const char* readString), void (*charCallbackFunc) (char readChar)) |
Electrotiger | 8:14bf9b541f9a | 14 | : btSerialObj(TX, RX), lineCallbackFunc(lineCallbackFunc), charCallbackFunc(charCallbackFunc) { |
Electrotiger | 8:14bf9b541f9a | 15 | btSerialObj.baud(115200); |
Electrotiger | 8:14bf9b541f9a | 16 | |
Electrotiger | 8:14bf9b541f9a | 17 | // Set the interrupt to be called when a byte is received. |
Electrotiger | 8:14bf9b541f9a | 18 | if ((lineCallbackFunc != NULL) || (charCallbackFunc != NULL)) { |
Electrotiger | 8:14bf9b541f9a | 19 | btSerialObj.attach(this, &HC06Bluetooth::receiveByteISR); |
Electrotiger | 8:14bf9b541f9a | 20 | } |
Electrotiger | 8:14bf9b541f9a | 21 | } |
Electrotiger | 8:14bf9b541f9a | 22 | |
Electrotiger | 8:14bf9b541f9a | 23 | void HC06Bluetooth::runSetup(std::string deviceName, std::string PIN) { |
Electrotiger | 8:14bf9b541f9a | 24 | // TODO: Sweep through a list of Baud rates until we find one that works! |
Electrotiger | 8:14bf9b541f9a | 25 | int numCharsReceived = 0; |
Electrotiger | 8:14bf9b541f9a | 26 | // The default baud rate is 9600. Overwrite it to 115200. |
Electrotiger | 8:14bf9b541f9a | 27 | btSerialObj.puts("AT+BAUD8"); |
Electrotiger | 8:14bf9b541f9a | 28 | btSerialObj.baud(115200); |
Electrotiger | 8:14bf9b541f9a | 29 | // Wait for the 8 character reply "OK115200" |
Electrotiger | 8:14bf9b541f9a | 30 | for(numCharsReceived = 0 ; numCharsReceived < 8; numCharsReceived++) { |
Electrotiger | 8:14bf9b541f9a | 31 | while(!btSerialObj.readable()); |
Electrotiger | 8:14bf9b541f9a | 32 | btSerialObj.getc(); |
Electrotiger | 8:14bf9b541f9a | 33 | } |
Electrotiger | 8:14bf9b541f9a | 34 | |
Electrotiger | 0:3ab5e47dde1e | 35 | // Set the name of the device. |
Electrotiger | 8:14bf9b541f9a | 36 | btSerialObj.puts(("AT+NAME" + deviceName.substr(0,20)).c_str()); |
Electrotiger | 8:14bf9b541f9a | 37 | // Wait for the 6 character reply "OKname" |
Electrotiger | 8:14bf9b541f9a | 38 | for(numCharsReceived = 0 ; numCharsReceived < 6; numCharsReceived++) { |
Electrotiger | 8:14bf9b541f9a | 39 | while(!btSerialObj.readable()); |
Electrotiger | 8:14bf9b541f9a | 40 | btSerialObj.getc(); |
Electrotiger | 8:14bf9b541f9a | 41 | } |
Electrotiger | 8:14bf9b541f9a | 42 | |
Electrotiger | 8:14bf9b541f9a | 43 | //Set the password of the device. |
Electrotiger | 8:14bf9b541f9a | 44 | btSerialObj.puts(("AT+PIN" + PIN.substr(0, 4)).c_str()); |
Electrotiger | 8:14bf9b541f9a | 45 | // Wait for the 8 character reply "OKsetpin" |
Electrotiger | 8:14bf9b541f9a | 46 | for(numCharsReceived = 0 ; numCharsReceived < 8; numCharsReceived++) { |
Electrotiger | 8:14bf9b541f9a | 47 | while(!btSerialObj.readable()); |
Electrotiger | 8:14bf9b541f9a | 48 | btSerialObj.getc(); |
Electrotiger | 3:ee17212e838e | 49 | } |
Electrotiger | 0:3ab5e47dde1e | 50 | } |
Electrotiger | 0:3ab5e47dde1e | 51 | |
Electrotiger | 0:3ab5e47dde1e | 52 | HC06Bluetooth::~HC06Bluetooth() { |
Electrotiger | 0:3ab5e47dde1e | 53 | // TODO Auto-generated destructor stub |
Electrotiger | 0:3ab5e47dde1e | 54 | } |
Electrotiger | 0:3ab5e47dde1e | 55 | |
Electrotiger | 6:5ba0038a7a9a | 56 | void HC06Bluetooth::print(const char* buffer) { |
Electrotiger | 6:5ba0038a7a9a | 57 | btSerialObj.puts(buffer); |
Electrotiger | 6:5ba0038a7a9a | 58 | } |
Electrotiger | 6:5ba0038a7a9a | 59 | |
Electrotiger | 8:14bf9b541f9a | 60 | void HC06Bluetooth::print(char c) { |
Electrotiger | 8:14bf9b541f9a | 61 | btSerialObj.putc(c); |
Electrotiger | 8:14bf9b541f9a | 62 | } |
Electrotiger | 8:14bf9b541f9a | 63 | |
Electrotiger | 0:3ab5e47dde1e | 64 | void HC06Bluetooth::receiveByteISR() { |
Electrotiger | 6:5ba0038a7a9a | 65 | while(btSerialObj.readable()) { |
Electrotiger | 1:026034717620 | 66 | // Get the character from the input. |
Electrotiger | 6:5ba0038a7a9a | 67 | char receivedChar = btSerialObj.getc(); |
Electrotiger | 8:14bf9b541f9a | 68 | |
Electrotiger | 8:14bf9b541f9a | 69 | // Call the character callback function if it is not null. |
Electrotiger | 8:14bf9b541f9a | 70 | if (charCallbackFunc != NULL) { |
Electrotiger | 8:14bf9b541f9a | 71 | charCallbackFunc(receivedChar); |
Electrotiger | 8:14bf9b541f9a | 72 | } |
Electrotiger | 8:14bf9b541f9a | 73 | |
Electrotiger | 8:14bf9b541f9a | 74 | // If the character is a newline or carriage return, then call the line callback function. |
Electrotiger | 8:14bf9b541f9a | 75 | if ((receivedChar == '\n') || (receivedChar == '\r')) { |
Electrotiger | 1:026034717620 | 76 | // Terminate the buffer with a null character, since that is what strings end with. |
Electrotiger | 1:026034717620 | 77 | receivedChar = '\0'; |
Electrotiger | 1:026034717620 | 78 | dataReceivedBuffer[dataReceivedBufferPos] = receivedChar; |
Electrotiger | 1:026034717620 | 79 | // Copy data from the buffer to a copy. |
Electrotiger | 1:026034717620 | 80 | std::copy(dataReceivedBuffer, dataReceivedBuffer + dataReceivedBufferPos, dataReceivedBufferCopy); |
Electrotiger | 1:026034717620 | 81 | // Reset the buffer position. |
Electrotiger | 1:026034717620 | 82 | dataReceivedBufferPos = 0; |
Electrotiger | 1:026034717620 | 83 | // Call the callback function. |
Electrotiger | 8:14bf9b541f9a | 84 | if (lineCallbackFunc != NULL) { |
Electrotiger | 8:14bf9b541f9a | 85 | lineCallbackFunc((const char*)dataReceivedBuffer); |
Electrotiger | 8:14bf9b541f9a | 86 | } |
Electrotiger | 1:026034717620 | 87 | } |
Electrotiger | 1:026034717620 | 88 | // Otherwise, just place it in the buffer and move on. |
Electrotiger | 1:026034717620 | 89 | else { |
Electrotiger | 8:14bf9b541f9a | 90 | dataReceivedBuffer[dataReceivedBufferPos] = receivedChar; |
Electrotiger | 1:026034717620 | 91 | dataReceivedBufferPos++; |
Electrotiger | 1:026034717620 | 92 | } |
Electrotiger | 1:026034717620 | 93 | } |
Electrotiger | 2:7e0453895727 | 94 | } |
Electrotiger | 0:3ab5e47dde1e | 95 |