基于Nucleo F411RE和光流模块的通讯实验,串口1接收到数据之后解析,并从串口2输出光流模块计算结果
Fork of Nucleo_serial by
main.cpp@5:5fd053d79f06, 2018-06-22 (annotated)
- Committer:
- adaphoto
- Date:
- Fri Jun 22 08:14:55 2018 +0000
- Revision:
- 5:5fd053d79f06
- Parent:
- 4:5ac470115649
??Nucleo F411RE??????????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bcostm | 0:028fac66239d | 1 | #include "mbed.h" |
bcostm | 1:e9d1c42a73ae | 2 | |
bcostm | 0:028fac66239d | 3 | Serial pc(SERIAL_TX, SERIAL_RX); |
hyhlik | 4:5ac470115649 | 4 | DigitalOut led01(LED1); |
bcostm | 2:08c13f9a3d5c | 5 | |
adaphoto | 5:5fd053d79f06 | 6 | // 光流传感器接口,串口,波特率115200,每一帧数据20个byte |
adaphoto | 5:5fd053d79f06 | 7 | // IO口定义 |
adaphoto | 5:5fd053d79f06 | 8 | Serial Optical_Flow(PA_15,PB_7); |
adaphoto | 5:5fd053d79f06 | 9 | // 变量 |
adaphoto | 5:5fd053d79f06 | 10 | char *get_Optical_Flow_Cmd(); |
adaphoto | 5:5fd053d79f06 | 11 | // 数据处理函数 |
adaphoto | 5:5fd053d79f06 | 12 | void Optical_Flow_Process_Cmd(char *cmd); |
adaphoto | 5:5fd053d79f06 | 13 | // 线程实现函数 |
adaphoto | 5:5fd053d79f06 | 14 | void Optical_Flow_Call_Back(); |
adaphoto | 5:5fd053d79f06 | 15 | // 线程 |
adaphoto | 5:5fd053d79f06 | 16 | Thread Optical_Flow_Thread; |
adaphoto | 5:5fd053d79f06 | 17 | |
adaphoto | 5:5fd053d79f06 | 18 | |
adaphoto | 5:5fd053d79f06 | 19 | |
adaphoto | 5:5fd053d79f06 | 20 | |
hyhlik | 4:5ac470115649 | 21 | int i; // for cycles |
adaphoto | 5:5fd053d79f06 | 22 | char cmd_on[] = "on"; |
adaphoto | 5:5fd053d79f06 | 23 | char cmd_off[] = "off"; |
hyhlik | 4:5ac470115649 | 24 | |
hyhlik | 4:5ac470115649 | 25 | char *getCmd(); |
hyhlik | 4:5ac470115649 | 26 | void processCmd(char *cmd); |
hyhlik | 4:5ac470115649 | 27 | |
hyhlik | 4:5ac470115649 | 28 | Thread t1; |
bcostm | 2:08c13f9a3d5c | 29 | |
hyhlik | 4:5ac470115649 | 30 | /////////////////////////////////////////////////////////////////////////////// |
hyhlik | 4:5ac470115649 | 31 | void tSerial_body() |
hyhlik | 4:5ac470115649 | 32 | { |
hyhlik | 4:5ac470115649 | 33 | while(1){ |
hyhlik | 4:5ac470115649 | 34 | if (pc.readable()) // if there is an character to read from the device |
hyhlik | 4:5ac470115649 | 35 | { |
hyhlik | 4:5ac470115649 | 36 | char *SerialCommand = getCmd(); |
hyhlik | 4:5ac470115649 | 37 | processCmd(SerialCommand); |
hyhlik | 4:5ac470115649 | 38 | free(SerialCommand); |
hyhlik | 4:5ac470115649 | 39 | } |
hyhlik | 4:5ac470115649 | 40 | } |
hyhlik | 4:5ac470115649 | 41 | } |
adaphoto | 5:5fd053d79f06 | 42 | //////////////////////////////////////////////////////////////////////////////// |
adaphoto | 5:5fd053d79f06 | 43 | void Optical_Flow_Call_Back() |
adaphoto | 5:5fd053d79f06 | 44 | { |
adaphoto | 5:5fd053d79f06 | 45 | while(true) |
adaphoto | 5:5fd053d79f06 | 46 | { |
adaphoto | 5:5fd053d79f06 | 47 | if (Optical_Flow.readable()) // if there is an character to read from the device |
adaphoto | 5:5fd053d79f06 | 48 | { |
adaphoto | 5:5fd053d79f06 | 49 | char *SerialCommand = get_Optical_Flow_Cmd(); |
adaphoto | 5:5fd053d79f06 | 50 | Optical_Flow_Process_Cmd(SerialCommand); |
adaphoto | 5:5fd053d79f06 | 51 | free(SerialCommand); |
adaphoto | 5:5fd053d79f06 | 52 | } |
adaphoto | 5:5fd053d79f06 | 53 | } |
adaphoto | 5:5fd053d79f06 | 54 | } |
hyhlik | 4:5ac470115649 | 55 | /////////////////////////////////////////////////////////////////////////////// |
hyhlik | 4:5ac470115649 | 56 | char *getCmd() |
bcostm | 2:08c13f9a3d5c | 57 | { |
hyhlik | 4:5ac470115649 | 58 | char buff[128]; |
hyhlik | 4:5ac470115649 | 59 | unsigned char ch; |
hyhlik | 4:5ac470115649 | 60 | int buffIndex = 0; |
hyhlik | 4:5ac470115649 | 61 | memset(buff, 0, sizeof(buff)); // clean the buffer |
hyhlik | 4:5ac470115649 | 62 | |
hyhlik | 4:5ac470115649 | 63 | |
hyhlik | 4:5ac470115649 | 64 | char *cmd = (char*)malloc(128); |
hyhlik | 4:5ac470115649 | 65 | if (!cmd) |
hyhlik | 4:5ac470115649 | 66 | return NULL; |
hyhlik | 4:5ac470115649 | 67 | do |
hyhlik | 4:5ac470115649 | 68 | { |
hyhlik | 4:5ac470115649 | 69 | ch = pc.getc(); // read it |
hyhlik | 4:5ac470115649 | 70 | if (buffIndex < 128){ // just to avoid buffer overflow |
hyhlik | 4:5ac470115649 | 71 | buff[buffIndex] = ch; // put it into the value array and increment the index |
hyhlik | 4:5ac470115649 | 72 | buffIndex++; |
hyhlik | 4:5ac470115649 | 73 | } |
hyhlik | 4:5ac470115649 | 74 | } |
hyhlik | 4:5ac470115649 | 75 | while (ch != '\n' && ch != '\r' ); |
hyhlik | 4:5ac470115649 | 76 | buff[buffIndex]='\0'; // add the end-signalling char |
hyhlik | 4:5ac470115649 | 77 | |
hyhlik | 4:5ac470115649 | 78 | if(strlen(buff) != 0){ |
hyhlik | 4:5ac470115649 | 79 | |
hyhlik | 4:5ac470115649 | 80 | for (i = 0 ; i < sizeof(buff) ; i++){ |
hyhlik | 4:5ac470115649 | 81 | if (buff[i] == '\n' || buff[i] == '\r'){ |
hyhlik | 4:5ac470115649 | 82 | cmd[i] = '\0'; |
hyhlik | 4:5ac470115649 | 83 | return cmd; |
hyhlik | 4:5ac470115649 | 84 | } |
hyhlik | 4:5ac470115649 | 85 | cmd[i] = buff[i]; |
hyhlik | 4:5ac470115649 | 86 | } |
hyhlik | 4:5ac470115649 | 87 | } |
hyhlik | 4:5ac470115649 | 88 | return NULL; |
hyhlik | 4:5ac470115649 | 89 | } |
adaphoto | 5:5fd053d79f06 | 90 | |
adaphoto | 5:5fd053d79f06 | 91 | char *get_Optical_Flow_Cmd() |
adaphoto | 5:5fd053d79f06 | 92 | { |
adaphoto | 5:5fd053d79f06 | 93 | char buff[128]; |
adaphoto | 5:5fd053d79f06 | 94 | unsigned char ch; |
adaphoto | 5:5fd053d79f06 | 95 | int buffIndex = 0; |
adaphoto | 5:5fd053d79f06 | 96 | memset(buff, 0, sizeof(buff)); // clean the buffer |
adaphoto | 5:5fd053d79f06 | 97 | |
adaphoto | 5:5fd053d79f06 | 98 | char *cmd = (char*)malloc(128); |
adaphoto | 5:5fd053d79f06 | 99 | if (!cmd) |
adaphoto | 5:5fd053d79f06 | 100 | return NULL; |
adaphoto | 5:5fd053d79f06 | 101 | do |
adaphoto | 5:5fd053d79f06 | 102 | { |
adaphoto | 5:5fd053d79f06 | 103 | ch = Optical_Flow.getc(); // read it |
adaphoto | 5:5fd053d79f06 | 104 | if (buffIndex < 128){ // just to avoid buffer overflow |
adaphoto | 5:5fd053d79f06 | 105 | buff[buffIndex] = ch; // put it into the value array and increment the index |
adaphoto | 5:5fd053d79f06 | 106 | buffIndex++; |
adaphoto | 5:5fd053d79f06 | 107 | } |
adaphoto | 5:5fd053d79f06 | 108 | } |
adaphoto | 5:5fd053d79f06 | 109 | while (ch != '\r' && ch != '\n' ); |
adaphoto | 5:5fd053d79f06 | 110 | buff[buffIndex]='\0'; // add the end-signalling char |
adaphoto | 5:5fd053d79f06 | 111 | |
adaphoto | 5:5fd053d79f06 | 112 | if(strlen(buff) != 0){ |
adaphoto | 5:5fd053d79f06 | 113 | |
adaphoto | 5:5fd053d79f06 | 114 | for (i = 0 ; i < sizeof(buff) ; i++){ |
adaphoto | 5:5fd053d79f06 | 115 | if (buff[i] == '\r' || buff[i] == '\n'){ |
adaphoto | 5:5fd053d79f06 | 116 | cmd[i] = '\0'; |
adaphoto | 5:5fd053d79f06 | 117 | return cmd; |
adaphoto | 5:5fd053d79f06 | 118 | } |
adaphoto | 5:5fd053d79f06 | 119 | cmd[i] = buff[i]; |
adaphoto | 5:5fd053d79f06 | 120 | } |
adaphoto | 5:5fd053d79f06 | 121 | } |
adaphoto | 5:5fd053d79f06 | 122 | return NULL; |
adaphoto | 5:5fd053d79f06 | 123 | } |
hyhlik | 4:5ac470115649 | 124 | /////////////////////////////////////////////////////////////////////////////// |
hyhlik | 4:5ac470115649 | 125 | void processCmd(char *cmd) |
hyhlik | 4:5ac470115649 | 126 | { |
hyhlik | 4:5ac470115649 | 127 | pc.printf("rec: \"%s\"\n\r", cmd); |
hyhlik | 4:5ac470115649 | 128 | if(strcmp(cmd,cmd_on) == 0){ |
hyhlik | 4:5ac470115649 | 129 | led01 = 1; |
hyhlik | 4:5ac470115649 | 130 | pc.printf("Turning the led on.\n\r"); |
hyhlik | 4:5ac470115649 | 131 | } else if (strcmp(cmd,cmd_off) == 0) { |
hyhlik | 4:5ac470115649 | 132 | led01 = 0; |
hyhlik | 4:5ac470115649 | 133 | pc.printf("Turning the led off.\n\r"); |
hyhlik | 4:5ac470115649 | 134 | |
bcostm | 2:08c13f9a3d5c | 135 | } |
bcostm | 0:028fac66239d | 136 | } |
hyhlik | 4:5ac470115649 | 137 | |
adaphoto | 5:5fd053d79f06 | 138 | void Optical_Flow_Process_Cmd(char *cmd) |
adaphoto | 5:5fd053d79f06 | 139 | { |
adaphoto | 5:5fd053d79f06 | 140 | int8_t Delta_X,Delta_Y,Delta_Z; |
adaphoto | 5:5fd053d79f06 | 141 | |
adaphoto | 5:5fd053d79f06 | 142 | Delta_X = (int8_t)(cmd[6]); |
adaphoto | 5:5fd053d79f06 | 143 | Delta_Y = (int8_t)(cmd[7]); |
adaphoto | 5:5fd053d79f06 | 144 | Delta_Z = (int8_t)(cmd[5]); |
adaphoto | 5:5fd053d79f06 | 145 | //pc.printf("rec: \"%s\"\n\r", cmd); |
adaphoto | 5:5fd053d79f06 | 146 | pc.printf("\r\n X:%d, Y:%d, Z:%d",Delta_X,Delta_Y,cmd[5]); |
adaphoto | 5:5fd053d79f06 | 147 | } |
hyhlik | 4:5ac470115649 | 148 | /////////////////////////////////////////////////////////////////////////////// |
hyhlik | 4:5ac470115649 | 149 | int main() |
hyhlik | 4:5ac470115649 | 150 | { |
adaphoto | 5:5fd053d79f06 | 151 | pc.baud(115200); |
adaphoto | 5:5fd053d79f06 | 152 | Optical_Flow.baud(115200); |
adaphoto | 5:5fd053d79f06 | 153 | //t1.start(tSerial_body); |
adaphoto | 5:5fd053d79f06 | 154 | Optical_Flow_Thread.start(Optical_Flow_Call_Back); |
adaphoto | 5:5fd053d79f06 | 155 | pc.printf("\r\n Optical Flow Test \r\n"); |
adaphoto | 5:5fd053d79f06 | 156 | //led01 = 1; |
hyhlik | 4:5ac470115649 | 157 | |
adaphoto | 5:5fd053d79f06 | 158 | //pc.printf("\n\r App started______Banik pyco\n\r"); |
adaphoto | 5:5fd053d79f06 | 159 | //int counter = 1; |
hyhlik | 4:5ac470115649 | 160 | while(1) |
hyhlik | 4:5ac470115649 | 161 | { |
adaphoto | 5:5fd053d79f06 | 162 | //pc.printf("seconds: %d\n\r", counter++); |
hyhlik | 4:5ac470115649 | 163 | wait(1); |
hyhlik | 4:5ac470115649 | 164 | } |
hyhlik | 4:5ac470115649 | 165 | } |