Driver for the JY-MCU v1.06 HC-06 Bluetooth module.

Dependents:   DISCO-F746NG_rtos_test MbedTableControl

Revision:
12:5ba022adbbfb
Parent:
11:aeb8c5c27111
Child:
13:5768b18a1289
--- a/HC06Bluetooth.cpp	Tue Aug 02 16:48:13 2016 +0000
+++ b/HC06Bluetooth.cpp	Tue Aug 02 20:16:26 2016 +0000
@@ -11,16 +11,15 @@
 /* Static methods used to help configure the Baudrate. */
 
 // WARNING: DO NOT CHANGE THESE VALUES, AS THEY ARE USED TO INDEX INTO AN ARRAY FOR IMPLEMENTATION.
-enum Baudrate {B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B921600, B1382400, END};
 const char* BaudATString[] = {"AT+BAUD1", "AT+BAUD2", "AT+BAUD3", "AT+BAUD4", "AT+BAUD5", "AT+BAUD6", "AT+BAUD7", "AT+BAUD8", "AT+BAUD9", "AT+BAUDA", "AT+BAUDB", "AT+BAUDC"};
 const int32_t BaudATReplyLength[] = {6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9};
 //const char* BaudATReplyPattern[] = {"OK1200", "OK2400", "OK4800","OK9600","OK19200","OK38400","OK57600","OK115200","OK230400","OK460800","OK921600","OK1382400"};
 const int32_t BaudValue[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1382400};
 
 /* HC06 Bluetooth Class Implementation: */
-HC06Bluetooth::HC06Bluetooth(PinName TX, PinName RX, void (*lineCallbackFunc) (const char* readString, size_t strlen), void (*charCallbackFunc) (char readChar))
-: btSerialObj(TX, RX), lineCallbackFunc(lineCallbackFunc), charCallbackFunc(charCallbackFunc) {
-    btSerialObj.baud(115200);
+HC06Bluetooth::HC06Bluetooth(PinName TX, PinName RX, Baudrate baudrate, void (*lineCallbackFunc) (const char* readString, size_t strlen), void (*charCallbackFunc) (char readChar))
+: btSerialObj(TX, RX), baudrate(baudrate), lineCallbackFunc(lineCallbackFunc), charCallbackFunc(charCallbackFunc) {
+    btSerialObj.baud(baudrate);
 
     // Set the interrupt to be called when a byte is received.
     if ((lineCallbackFunc != NULL) || (charCallbackFunc != NULL)) {
@@ -33,11 +32,11 @@
     // Detatch the interrupt.
     btSerialObj.attach(NULL);
     /* Sweep through a list of Baud rates until we find the one that the device has previously been set to. */
-    bool baudFound = false;
+    volatile bool baudFound = false;
     Timer timeOut;
     timeOut.start();
     // For every baud rate in the list:
-    for (int i = 0; (i < END) && (!baudFound); i++) {
+    for (volatile int i = 0; (i < END) && (!baudFound); i++) {
         // Set the communication baud rate to it.
         btSerialObj.baud(BaudValue[i]);
         // Send the test command "AT" to the device.
@@ -56,29 +55,32 @@
         btSerialObj.getc();
     }
     //Overwrite the Baud rate to 115200.
-    btSerialObj.puts(BaudATString[B115200]);
-    btSerialObj.baud(BaudValue[B115200]);
+    btSerialObj.puts(BaudATString[baudrate]);
+    btSerialObj.baud(BaudValue[baudrate]);
     // Wait for the 8 character reply "OK115200"
-    for(numCharsReceived = 0 ; numCharsReceived < BaudATReplyLength[B115200]; numCharsReceived++) {
+    for(numCharsReceived = 0 ; numCharsReceived < BaudATReplyLength[baudrate]; numCharsReceived++) {
         //while(!btSerialObj.readable());
-        btSerialObj.getc();
+        //btSerialObj.getc();
     }
+    wait_ms(1000);
 
     // Set the name of the device.
     btSerialObj.puts(("AT+NAME" + deviceName.substr(0,20)).c_str());
     // Wait for the 6 character reply "OKname"
     for(numCharsReceived = 0 ; numCharsReceived < 6; numCharsReceived++) {
-        while(!btSerialObj.readable());
-        btSerialObj.getc();
+        //while(!btSerialObj.readable());
+        //btSerialObj.getc();
     }
+    wait_ms(1000);
 
     //Set the password of the device.
     btSerialObj.puts(("AT+PIN" + PIN.substr(0, 4)).c_str());
     // Wait for the 8 character reply "OKsetpin"
     for(numCharsReceived = 0 ; numCharsReceived < 8; numCharsReceived++) {
-        while(!btSerialObj.readable());
-        btSerialObj.getc();
+        //while(!btSerialObj.readable());
+        //btSerialObj.getc();
     }
+    wait_ms(1000);
     // Reattach the interrupt.
     btSerialObj.attach(this, &HC06Bluetooth::receiveByteISR);
 }