test

Dependencies:   mbed Motordriver SRF05

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?

UserRevisionLine numberNew 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 }