test
Dependencies: mbed Motordriver SRF05
main.cpp@1:4e8b56a7698e, 2016-12-08 (annotated)
- Committer:
- brian12858
- Date:
- Thu Dec 08 06:54:15 2016 +0000
- Revision:
- 1:4e8b56a7698e
- Parent:
- 0:6d65c70ef417
tag thread problem
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
brian12858 | 0:6d65c70ef417 | 1 | #include "mbed.h" |
brian12858 | 0:6d65c70ef417 | 2 | #include <string> |
brian12858 | 0:6d65c70ef417 | 3 | #include <cstring> |
brian12858 | 1:4e8b56a7698e | 4 | #include "rtos.h" |
brian12858 | 1:4e8b56a7698e | 5 | #include "motordriver.h" |
brian12858 | 0:6d65c70ef417 | 6 | Serial bt(p28,p27);//tx,rx |
brian12858 | 0:6d65c70ef417 | 7 | Serial TAG(p9,p10);//tx,rx |
brian12858 | 0:6d65c70ef417 | 8 | Serial pc(USBTX,USBRX); |
brian12858 | 0:6d65c70ef417 | 9 | using namespace std; |
brian12858 | 0:6d65c70ef417 | 10 | |
brian12858 | 0:6d65c70ef417 | 11 | void read_line(); |
brian12858 | 0:6d65c70ef417 | 12 | void Rx_interrupt(); |
brian12858 | 0:6d65c70ef417 | 13 | // Circular buffers for serial TX and RX data - used by interrupt routines |
brian12858 | 0:6d65c70ef417 | 14 | const int buffer_size = 255; |
brian12858 | 0:6d65c70ef417 | 15 | // might need to increase buffer size for high baud rates |
brian12858 | 0:6d65c70ef417 | 16 | char rx_buffer[buffer_size+1]; |
brian12858 | 0:6d65c70ef417 | 17 | volatile int rx_in=0; |
brian12858 | 0:6d65c70ef417 | 18 | volatile int rx_out=0; |
brian12858 | 0:6d65c70ef417 | 19 | char rx_line[80]; |
brian12858 | 0:6d65c70ef417 | 20 | |
brian12858 | 1:4e8b56a7698e | 21 | Motor R(p21, p22, p23, 1); // pwm, fwd, rev, can brake ,right |
brian12858 | 1:4e8b56a7698e | 22 | Motor L(p26, p25, p24, 1); // pwm, fwd, rev, can brake ,left |
brian12858 | 1:4e8b56a7698e | 23 | |
brian12858 | 1:4e8b56a7698e | 24 | string tagStr1,tagStr2,tagStr3; |
brian12858 | 1:4e8b56a7698e | 25 | bool flag1=false,flag2=false,flag3=false; |
brian12858 | 1:4e8b56a7698e | 26 | string str; |
brian12858 | 1:4e8b56a7698e | 27 | |
brian12858 | 1:4e8b56a7698e | 28 | //接收tag資料與透過藍芽發送資料至pc端 |
brian12858 | 1:4e8b56a7698e | 29 | void thread_tag(){ |
brian12858 | 0:6d65c70ef417 | 30 | bt.baud(38400); |
brian12858 | 0:6d65c70ef417 | 31 | pc.baud(9600); |
brian12858 | 0:6d65c70ef417 | 32 | TAG.baud(115200); |
brian12858 | 1:4e8b56a7698e | 33 | TAG.attach(&Rx_interrupt, Serial::RxIrq); |
brian12858 | 1:4e8b56a7698e | 34 | |
brian12858 | 1:4e8b56a7698e | 35 | while(1) { |
brian12858 | 0:6d65c70ef417 | 36 | //若有tag資料傳入,則進行讀資料 |
brian12858 | 1:4e8b56a7698e | 37 | //if(TAG.readable()){ |
brian12858 | 1:4e8b56a7698e | 38 | //pc.printf("have data\n\r"); |
brian12858 | 1:4e8b56a7698e | 39 | |
brian12858 | 1:4e8b56a7698e | 40 | str=""; |
brian12858 | 1:4e8b56a7698e | 41 | //讀入所有資料,並寫放入string中 |
brian12858 | 1:4e8b56a7698e | 42 | //pc.printf("read data\n\r"); |
brian12858 | 1:4e8b56a7698e | 43 | read_line(); |
brian12858 | 1:4e8b56a7698e | 44 | // Read ASCII number from rx line buffer |
brian12858 | 1:4e8b56a7698e | 45 | //sscanf(rx_line,"%d",&rx_i); |
brian12858 | 1:4e8b56a7698e | 46 | |
brian12858 | 1:4e8b56a7698e | 47 | pc.printf("tag thread."); |
brian12858 | 1:4e8b56a7698e | 48 | switch(rx_line[1]){ |
brian12858 | 1:4e8b56a7698e | 49 | case '0': |
brian12858 | 1:4e8b56a7698e | 50 | flag1=true; |
brian12858 | 1:4e8b56a7698e | 51 | tagStr1=&rx_line[2]; |
brian12858 | 1:4e8b56a7698e | 52 | pc.printf("string1 = %s\n\r",tagStr1); |
brian12858 | 1:4e8b56a7698e | 53 | break; |
brian12858 | 1:4e8b56a7698e | 54 | case '1': |
brian12858 | 1:4e8b56a7698e | 55 | flag2=true; |
brian12858 | 1:4e8b56a7698e | 56 | tagStr2=&rx_line[2]; |
brian12858 | 1:4e8b56a7698e | 57 | pc.printf("string2 = %s\n\r",tagStr2); |
brian12858 | 1:4e8b56a7698e | 58 | break; |
brian12858 | 1:4e8b56a7698e | 59 | case '2': |
brian12858 | 1:4e8b56a7698e | 60 | flag3=true; |
brian12858 | 1:4e8b56a7698e | 61 | tagStr3=&rx_line[2]; |
brian12858 | 1:4e8b56a7698e | 62 | pc.printf("string3 = %s\n\r",tagStr3); |
brian12858 | 1:4e8b56a7698e | 63 | break; |
brian12858 | 0:6d65c70ef417 | 64 | } |
brian12858 | 1:4e8b56a7698e | 65 | if(flag3==true&&flag2==true&&flag1==true){ |
brian12858 | 1:4e8b56a7698e | 66 | flag1=false,flag2=false,flag3=false; |
brian12858 | 1:4e8b56a7698e | 67 | str=tagStr1+","+tagStr2+","+tagStr3; |
brian12858 | 1:4e8b56a7698e | 68 | bt.printf("%s\n",str); |
brian12858 | 0:6d65c70ef417 | 69 | } |
brian12858 | 0:6d65c70ef417 | 70 | } |
brian12858 | 0:6d65c70ef417 | 71 | } |
brian12858 | 1:4e8b56a7698e | 72 | |
brian12858 | 1:4e8b56a7698e | 73 | bool mode_flag=true; |
brian12858 | 1:4e8b56a7698e | 74 | int main(){ |
brian12858 | 1:4e8b56a7698e | 75 | |
brian12858 | 1:4e8b56a7698e | 76 | bt.baud(38400); |
brian12858 | 1:4e8b56a7698e | 77 | //pc.baud(9600); |
brian12858 | 1:4e8b56a7698e | 78 | //pc.printf("start"); |
brian12858 | 1:4e8b56a7698e | 79 | Thread thread0(thread_tag); |
brian12858 | 1:4e8b56a7698e | 80 | |
brian12858 | 1:4e8b56a7698e | 81 | // 若收到藍牙模組的資料,則送到「序列埠監控視窗」 |
brian12858 | 1:4e8b56a7698e | 82 | char ch[1]={'s'}; |
brian12858 | 1:4e8b56a7698e | 83 | while(1) { |
brian12858 | 1:4e8b56a7698e | 84 | //pc.printf("ch[0]= %s\n\r",ch); |
brian12858 | 1:4e8b56a7698e | 85 | if(bt.readable ()){ |
brian12858 | 1:4e8b56a7698e | 86 | ch[0]=bt.getc(); |
brian12858 | 1:4e8b56a7698e | 87 | //pc.printf("string1 = %s\n\r",ch); |
brian12858 | 1:4e8b56a7698e | 88 | } |
brian12858 | 1:4e8b56a7698e | 89 | switch(ch[0]){ |
brian12858 | 1:4e8b56a7698e | 90 | case 'w': |
brian12858 | 1:4e8b56a7698e | 91 | //前進 |
brian12858 | 1:4e8b56a7698e | 92 | R.speed(-0.9),L.speed(-1); |
brian12858 | 1:4e8b56a7698e | 93 | break; |
brian12858 | 1:4e8b56a7698e | 94 | case 'a': |
brian12858 | 1:4e8b56a7698e | 95 | //左轉 |
brian12858 | 1:4e8b56a7698e | 96 | R.speed(0),L.speed(-1); |
brian12858 | 1:4e8b56a7698e | 97 | break; |
brian12858 | 1:4e8b56a7698e | 98 | case 's': |
brian12858 | 1:4e8b56a7698e | 99 | //停住 |
brian12858 | 1:4e8b56a7698e | 100 | R.stop(0.3),L.stop(0.4); |
brian12858 | 1:4e8b56a7698e | 101 | break; |
brian12858 | 1:4e8b56a7698e | 102 | case 'd': |
brian12858 | 1:4e8b56a7698e | 103 | //右轉 |
brian12858 | 1:4e8b56a7698e | 104 | R.speed(-0.9),L.speed(0); |
brian12858 | 1:4e8b56a7698e | 105 | break; |
brian12858 | 1:4e8b56a7698e | 106 | case 'x': |
brian12858 | 1:4e8b56a7698e | 107 | //backward |
brian12858 | 1:4e8b56a7698e | 108 | R.speed(0.9),L.speed(1); |
brian12858 | 1:4e8b56a7698e | 109 | break; |
brian12858 | 1:4e8b56a7698e | 110 | case 'm': |
brian12858 | 1:4e8b56a7698e | 111 | //自走車 |
brian12858 | 1:4e8b56a7698e | 112 | break; |
brian12858 | 1:4e8b56a7698e | 113 | } |
brian12858 | 1:4e8b56a7698e | 114 | } |
brian12858 | 1:4e8b56a7698e | 115 | } |
brian12858 | 1:4e8b56a7698e | 116 | void auto_mode(){ |
brian12858 | 1:4e8b56a7698e | 117 | //自走程式放入位置 |
brian12858 | 1:4e8b56a7698e | 118 | |
brian12858 | 1:4e8b56a7698e | 119 | } |
brian12858 | 1:4e8b56a7698e | 120 | |
brian12858 | 0:6d65c70ef417 | 121 | // Read a line from the large rx buffer from rx interrupt routine |
brian12858 | 0:6d65c70ef417 | 122 | void read_line() { |
brian12858 | 0:6d65c70ef417 | 123 | int i; |
brian12858 | 0:6d65c70ef417 | 124 | i = 0; |
brian12858 | 0:6d65c70ef417 | 125 | // Start Critical Section - don't interrupt while changing global buffer variables |
brian12858 | 0:6d65c70ef417 | 126 | NVIC_DisableIRQ(UART1_IRQn); |
brian12858 | 0:6d65c70ef417 | 127 | // Loop reading rx buffer characters until end of line character |
brian12858 | 0:6d65c70ef417 | 128 | while ((i==0) || (rx_line[i-1] != '\r')) { |
brian12858 | 0:6d65c70ef417 | 129 | // Wait if buffer empty |
brian12858 | 0:6d65c70ef417 | 130 | if (rx_in == rx_out) { |
brian12858 | 0:6d65c70ef417 | 131 | // End Critical Section - need to allow rx interrupt to get new characters for buffer |
brian12858 | 0:6d65c70ef417 | 132 | NVIC_EnableIRQ(UART1_IRQn); |
brian12858 | 0:6d65c70ef417 | 133 | while (rx_in == rx_out) { |
brian12858 | 0:6d65c70ef417 | 134 | } |
brian12858 | 0:6d65c70ef417 | 135 | // Start Critical Section - don't interrupt while changing global buffer variables |
brian12858 | 0:6d65c70ef417 | 136 | NVIC_DisableIRQ(UART1_IRQn); |
brian12858 | 0:6d65c70ef417 | 137 | } |
brian12858 | 0:6d65c70ef417 | 138 | rx_line[i] = rx_buffer[rx_out]; |
brian12858 | 0:6d65c70ef417 | 139 | i++; |
brian12858 | 0:6d65c70ef417 | 140 | rx_out = (rx_out + 1) % buffer_size; |
brian12858 | 0:6d65c70ef417 | 141 | } |
brian12858 | 0:6d65c70ef417 | 142 | // End Critical Section |
brian12858 | 0:6d65c70ef417 | 143 | NVIC_EnableIRQ(UART1_IRQn); |
brian12858 | 0:6d65c70ef417 | 144 | rx_line[i-1] = 0; |
brian12858 | 0:6d65c70ef417 | 145 | return; |
brian12858 | 0:6d65c70ef417 | 146 | } |
brian12858 | 0:6d65c70ef417 | 147 | |
brian12858 | 0:6d65c70ef417 | 148 | // Interupt Routine to read in data from serial port |
brian12858 | 0:6d65c70ef417 | 149 | void Rx_interrupt() { |
brian12858 | 0:6d65c70ef417 | 150 | // Loop just in case more than one character is in UART's receive FIFO buffer |
brian12858 | 0:6d65c70ef417 | 151 | // Stop if buffer full |
brian12858 | 0:6d65c70ef417 | 152 | while ((TAG.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { |
brian12858 | 0:6d65c70ef417 | 153 | rx_buffer[rx_in] = TAG.getc(); |
brian12858 | 0:6d65c70ef417 | 154 | // Uncomment to Echo to USB serial to watch data flow |
brian12858 | 0:6d65c70ef417 | 155 | // monitor_TAG.putc(rx_buffer[rx_in]); |
brian12858 | 0:6d65c70ef417 | 156 | rx_in = (rx_in + 1) % buffer_size; |
brian12858 | 0:6d65c70ef417 | 157 | } |
brian12858 | 0:6d65c70ef417 | 158 | return; |
brian12858 | 0:6d65c70ef417 | 159 | } |