基于Nucleo F411RE和光流模块的通讯实验,串口1接收到数据之后解析,并从串口2输出光流模块计算结果

Fork of Nucleo_serial by Tomas Hyhlík

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?

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