TYBLE16 serial communication (UART) for both "Central" and "Peripheral".
Fork of TYBLE16_BME280_data_sender by
Please refer following page.
/users/kenjiArai/notebook/tyble16-module--uart-communication-between-central/#
main.cpp@2:f44ef892b2b2, 2017-11-19 (annotated)
- Committer:
- kenjiArai
- Date:
- Sun Nov 19 09:46:27 2017 +0000
- Revision:
- 2:f44ef892b2b2
- Parent:
- 1:f2982d4f4037
TYBLE16 serial communication (UART) for both "Central" and "Peripheral".
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:c3a498a8091c | 1 | /* |
kenjiArai | 0:c3a498a8091c | 2 | * Mbed Application program / Using Akizuki BLE Module AE-TYBLE16 |
kenjiArai | 0:c3a498a8091c | 3 | * on-board module : TAIYO YUDEN BLE 4.2 TYSA-B (EYSGJNAWY-WX) |
kenjiArai | 0:c3a498a8091c | 4 | * |
kenjiArai | 0:c3a498a8091c | 5 | * http://akizukidenshi.com/catalog/g/gK-12339/ |
kenjiArai | 0:c3a498a8091c | 6 | * |
kenjiArai | 0:c3a498a8091c | 7 | * Refernce document |
kenjiArai | 0:c3a498a8091c | 8 | * https://www.yuden.co.jp/wireless_module/document/datareport2/jp/ |
kenjiArai | 0:c3a498a8091c | 9 | * TY_BLE_EYSGJNAWY_WX_BriefDataReport_V1_3_20170925J.pdf |
kenjiArai | 0:c3a498a8091c | 10 | * |
kenjiArai | 0:c3a498a8091c | 11 | * Copyright (c) 2017 Kenji Arai / JH1PJL |
kenjiArai | 0:c3a498a8091c | 12 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:c3a498a8091c | 13 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:c3a498a8091c | 14 | * Created: October 27th, 2017 |
kenjiArai | 2:f44ef892b2b2 | 15 | * Revised: November 19th, 2017 |
kenjiArai | 0:c3a498a8091c | 16 | */ |
kenjiArai | 0:c3a498a8091c | 17 | |
kenjiArai | 0:c3a498a8091c | 18 | /* |
kenjiArai | 0:c3a498a8091c | 19 | Tested condition |
kenjiArai | 2:f44ef892b2b2 | 20 | mbed-os-5.6.4 & mbed Rev.157(release 155?) |
kenjiArai | 2:f44ef892b2b2 | 21 | Nucleo-F446RE TYBLE16 /also F411RE |
kenjiArai | 2:f44ef892b2b2 | 22 | PA_9 (D8) pin5 / P0.03(UART_RX) |
kenjiArai | 2:f44ef892b2b2 | 23 | PA_10(D2) pin6 / P0.01(UART_TX) |
kenjiArai | 2:f44ef892b2b2 | 24 | pin7 / P0.02(UART_CTS) connected to pin8 / P0.00(UART_RTS) |
kenjiArai | 2:f44ef892b2b2 | 25 | PB_3 (D3) pin15 / P0.23(MODE) Mode indication |
kenjiArai | 0:c3a498a8091c | 26 | +3.3v pin14 / +V |
kenjiArai | 0:c3a498a8091c | 27 | GND pin13 / GND |
kenjiArai | 2:f44ef892b2b2 | 28 | */ |
kenjiArai | 2:f44ef892b2b2 | 29 | |
kenjiArai | 2:f44ef892b2b2 | 30 | /* |
kenjiArai | 2:f44ef892b2b2 | 31 | --- HOW TO ESTABLISH CENTRAL AND PERIPHERAL UART --- |
kenjiArai | 2:f44ef892b2b2 | 32 | 1) Prepare one peripheral module/TYBLE16 |
kenjiArai | 2:f44ef892b2b2 | 33 | 2) Prepare another TYBLE16 module which was programed as "Central mode" |
kenjiArai | 2:f44ef892b2b2 | 34 | Please refer "TYBLE16_set_Central_or_ Peripheral" program |
kenjiArai | 2:f44ef892b2b2 | 35 | 3) Programing "TYBLE16_Uart_Central_and_Peripheral" into Mbed boards |
kenjiArai | 2:f44ef892b2b2 | 36 | (same program into both "Central" and "Peripheral" Mbed board) |
kenjiArai | 2:f44ef892b2b2 | 37 | 4) If you turn on both the "Central" and "Peripheral" power at the same time, |
kenjiArai | 2:f44ef892b2b2 | 38 | the connection is automatically started |
kenjiArai | 0:c3a498a8091c | 39 | */ |
kenjiArai | 0:c3a498a8091c | 40 | |
kenjiArai | 0:c3a498a8091c | 41 | // Include -------------------------------------------------------------------- |
kenjiArai | 2:f44ef892b2b2 | 42 | #include "mbed.h" |
kenjiArai | 2:f44ef892b2b2 | 43 | #include "RingBuffer.h" |
kenjiArai | 0:c3a498a8091c | 44 | |
kenjiArai | 0:c3a498a8091c | 45 | // Definition ----------------------------------------------------------------- |
kenjiArai | 2:f44ef892b2b2 | 46 | #define TIME_OUT 5 // 5 sec |
kenjiArai | 2:f44ef892b2b2 | 47 | #define BF_SIZE_BLE 256 |
kenjiArai | 2:f44ef892b2b2 | 48 | #define BF_SIZE_PC 256 |
kenjiArai | 2:f44ef892b2b2 | 49 | #define BF_SIZE_LINE 32 |
kenjiArai | 0:c3a498a8091c | 50 | |
kenjiArai | 0:c3a498a8091c | 51 | // Object/ Constructor -------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 52 | Serial pc(USBTX,USBRX); |
kenjiArai | 2:f44ef892b2b2 | 53 | Serial tyble16(D8, D2); |
kenjiArai | 2:f44ef892b2b2 | 54 | DigitalIn tyble16_mode(D3); |
kenjiArai | 2:f44ef892b2b2 | 55 | Ticker t; |
kenjiArai | 2:f44ef892b2b2 | 56 | RingBuffer ble_bf(BF_SIZE_BLE); |
kenjiArai | 2:f44ef892b2b2 | 57 | RingBuffer pc_bf(BF_SIZE_PC); |
kenjiArai | 0:c3a498a8091c | 58 | |
kenjiArai | 0:c3a498a8091c | 59 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 0:c3a498a8091c | 60 | |
kenjiArai | 0:c3a498a8091c | 61 | // ROM / Constant data -------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 62 | |
kenjiArai | 0:c3a498a8091c | 63 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 64 | void check_connection(void); |
kenjiArai | 2:f44ef892b2b2 | 65 | void excute_command(char *); |
kenjiArai | 2:f44ef892b2b2 | 66 | void ble_rx(void); |
kenjiArai | 2:f44ef892b2b2 | 67 | void pc_rx(void); |
kenjiArai | 0:c3a498a8091c | 68 | |
kenjiArai | 0:c3a498a8091c | 69 | //------------------------------------------------------------------------------ |
kenjiArai | 0:c3a498a8091c | 70 | // Control Program |
kenjiArai | 0:c3a498a8091c | 71 | //------------------------------------------------------------------------------ |
kenjiArai | 0:c3a498a8091c | 72 | int main() |
kenjiArai | 0:c3a498a8091c | 73 | { |
kenjiArai | 2:f44ef892b2b2 | 74 | static char rcv_bf[BF_SIZE_LINE]; |
kenjiArai | 0:c3a498a8091c | 75 | static uint8_t n = 0; |
kenjiArai | 0:c3a498a8091c | 76 | char c = 0; |
kenjiArai | 0:c3a498a8091c | 77 | |
kenjiArai | 2:f44ef892b2b2 | 78 | tyble16.attach(&ble_rx, Serial::RxIrq); // Set interrupt handler |
kenjiArai | 2:f44ef892b2b2 | 79 | pc.attach(&pc_rx, Serial::RxIrq); // Set interrupt handler |
kenjiArai | 2:f44ef892b2b2 | 80 | pc.printf("\r\nUART/TYBLE16(%s, %s UTC)\r\n", __DATE__, __TIME__); |
kenjiArai | 2:f44ef892b2b2 | 81 | tyble16.printf("I'm TYBLE16\r\n"); |
kenjiArai | 0:c3a498a8091c | 82 | t.attach(check_connection, 1); |
kenjiArai | 0:c3a498a8091c | 83 | while(true){ |
kenjiArai | 2:f44ef892b2b2 | 84 | while(ble_bf.check() != 0){ |
kenjiArai | 2:f44ef892b2b2 | 85 | //----- receive data ----------------------------------------------- |
kenjiArai | 2:f44ef892b2b2 | 86 | c = ble_bf.read(); // data received |
kenjiArai | 0:c3a498a8091c | 87 | pc.putc(c); // show to console |
kenjiArai | 0:c3a498a8091c | 88 | rcv_bf[n++] = c; // save int buf |
kenjiArai | 2:f44ef892b2b2 | 89 | // avoid buffer overflow |
kenjiArai | 2:f44ef892b2b2 | 90 | if (n >= (BF_SIZE_LINE - 5)){ n = (BF_SIZE_LINE - 5);} |
kenjiArai | 0:c3a498a8091c | 91 | if (c == '\n'){ // end one line |
kenjiArai | 0:c3a498a8091c | 92 | pc.putc('\r'); |
kenjiArai | 0:c3a498a8091c | 93 | rcv_bf[n] = 0; |
kenjiArai | 2:f44ef892b2b2 | 94 | if (n >3){ // command ~?\r\n ?=specified one character |
kenjiArai | 2:f44ef892b2b2 | 95 | if ((rcv_bf[0] == '~') && (rcv_bf[2] == '\r')){ |
kenjiArai | 2:f44ef892b2b2 | 96 | excute_command(rcv_bf); |
kenjiArai | 0:c3a498a8091c | 97 | } |
kenjiArai | 0:c3a498a8091c | 98 | } |
kenjiArai | 0:c3a498a8091c | 99 | n = 0; // Clear buffer |
kenjiArai | 0:c3a498a8091c | 100 | } |
kenjiArai | 0:c3a498a8091c | 101 | } |
kenjiArai | 2:f44ef892b2b2 | 102 | while(pc_bf.check() != 0){ |
kenjiArai | 2:f44ef892b2b2 | 103 | //----- send data -------------------------------------------------- |
kenjiArai | 2:f44ef892b2b2 | 104 | char c = pc_bf.read(); |
kenjiArai | 0:c3a498a8091c | 105 | tyble16.putc(c); |
kenjiArai | 0:c3a498a8091c | 106 | pc.putc(c); // echo back |
kenjiArai | 0:c3a498a8091c | 107 | if(c == '\r'){ // if CR then put LF |
kenjiArai | 0:c3a498a8091c | 108 | tyble16.putc('\n'); |
kenjiArai | 0:c3a498a8091c | 109 | pc.putc('\n'); |
kenjiArai | 0:c3a498a8091c | 110 | } |
kenjiArai | 0:c3a498a8091c | 111 | } |
kenjiArai | 0:c3a498a8091c | 112 | } |
kenjiArai | 0:c3a498a8091c | 113 | } |
kenjiArai | 0:c3a498a8091c | 114 | |
kenjiArai | 2:f44ef892b2b2 | 115 | // special command (You can make your own commands) |
kenjiArai | 2:f44ef892b2b2 | 116 | void excute_command(char *buf) |
kenjiArai | 0:c3a498a8091c | 117 | { |
kenjiArai | 2:f44ef892b2b2 | 118 | char c = buf[1]; |
kenjiArai | 2:f44ef892b2b2 | 119 | switch (c){ |
kenjiArai | 2:f44ef892b2b2 | 120 | case 'x': // corrent -> nothing to do |
kenjiArai | 2:f44ef892b2b2 | 121 | tyble16.printf("Accept 'x' Command\r\n"); |
kenjiArai | 2:f44ef892b2b2 | 122 | break; |
kenjiArai | 2:f44ef892b2b2 | 123 | case '?': // Help |
kenjiArai | 2:f44ef892b2b2 | 124 | tyble16.printf("Command not available\r\n"); |
kenjiArai | 2:f44ef892b2b2 | 125 | tyble16.printf("Please set your own command\r\n"); |
kenjiArai | 2:f44ef892b2b2 | 126 | break; |
kenjiArai | 2:f44ef892b2b2 | 127 | default: // no available command |
kenjiArai | 2:f44ef892b2b2 | 128 | tyble16.printf("Command not available\r\n"); |
kenjiArai | 2:f44ef892b2b2 | 129 | break; |
kenjiArai | 0:c3a498a8091c | 130 | } |
kenjiArai | 0:c3a498a8091c | 131 | } |
kenjiArai | 0:c3a498a8091c | 132 | |
kenjiArai | 2:f44ef892b2b2 | 133 | // Interrupt routine / Data from BLE |
kenjiArai | 2:f44ef892b2b2 | 134 | void ble_rx() |
kenjiArai | 2:f44ef892b2b2 | 135 | { |
kenjiArai | 2:f44ef892b2b2 | 136 | ble_bf.save(tyble16.getc()); // BLE RX data save into ring buffer |
kenjiArai | 2:f44ef892b2b2 | 137 | } |
kenjiArai | 2:f44ef892b2b2 | 138 | |
kenjiArai | 2:f44ef892b2b2 | 139 | // Interrupt routine / Data from PC |
kenjiArai | 2:f44ef892b2b2 | 140 | void pc_rx() |
kenjiArai | 2:f44ef892b2b2 | 141 | { |
kenjiArai | 2:f44ef892b2b2 | 142 | pc_bf.save(pc.getc()); // PC RX data save into ring buffer |
kenjiArai | 2:f44ef892b2b2 | 143 | } |
kenjiArai | 2:f44ef892b2b2 | 144 | |
kenjiArai | 0:c3a498a8091c | 145 | // Every one second, check communication status |
kenjiArai | 0:c3a498a8091c | 146 | void check_connection(void) |
kenjiArai | 0:c3a498a8091c | 147 | { |
kenjiArai | 0:c3a498a8091c | 148 | static int8_t counter = 0; |
kenjiArai | 0:c3a498a8091c | 149 | |
kenjiArai | 2:f44ef892b2b2 | 150 | if (tyble16_mode == 0){ // Not connected |
kenjiArai | 0:c3a498a8091c | 151 | if (++counter >= TIME_OUT){ |
kenjiArai | 2:f44ef892b2b2 | 152 | // Software reset |
kenjiArai | 2:f44ef892b2b2 | 153 | tyble16.puts("BRS\r\n"); |
kenjiArai | 0:c3a498a8091c | 154 | counter = 0; |
kenjiArai | 0:c3a498a8091c | 155 | } |
kenjiArai | 0:c3a498a8091c | 156 | } else { |
kenjiArai | 0:c3a498a8091c | 157 | counter = 0; |
kenjiArai | 0:c3a498a8091c | 158 | } |
kenjiArai | 0:c3a498a8091c | 159 | } |