현성 김 / Mbed 2 deprecated 181202_Castone_design_master

Dependencies:   mbed nRF24L01P

Branch:
RF24_library_test_tx
Revision:
16:7a78838b3b8a
Parent:
15:217b3e5a2275
Child:
17:6ae73e8943ce
--- a/main.cpp	Sat Dec 01 15:37:05 2018 +0000
+++ b/main.cpp	Sat Dec 01 17:29:32 2018 +0000
@@ -10,6 +10,12 @@
 #define spi_IRQ     D4
 
 #define TRANSFER_SIZE 15
+#define MAX_BUFFER_SIZE 255
+#define BUFFER_SIZE MAX_BUFFER_SIZE
+
+#define DATA_PROTOCOL_BEGIN '$'
+#define DATA_PROTOCOL_TOKEN ','
+#define DATA_PROTOCOL_END   '*'
 
 nRF24L01P nrf(spi_MOSI, spi_MISO, spi_SCK, nrf_CSN, nrf_CE, spi_IRQ);    // mosi, miso, sck, csn, ce, irq
 
@@ -21,19 +27,30 @@
 void initNRF();
 void dumpRFInfo();
 void getPayload(int id, unsigned int count, int lspeed, int rspeed, char* txData);
-
+int readSerialUntil(char *buffer, unsigned int buf_len, char terminator);
+char* inspectData(char *buffer, int buf_len);
 
-int main() {
+int main()
+{
     int inByteCnt = 0;
-    char buf[TRANSFER_SIZE+3];
-    
+    char buffer[BUFFER_SIZE];
     beepStart();
     pc.baud(115200);
     printf("I'm Master\r\n");
     initNRF();
     dumpRFInfo();
     
+    memset(buffer, NULL, BUFFER_SIZE);
+
     while(1) {
+        int result = readSerialUntil(buffer, BUFFER_SIZE, DATA_PROTOCOL_END);
+        if(result>0) {
+            char *data = inspectData(buffer, BUFFER_SIZE);
+            printf("Data: %s\r\n", data);
+            free(data);
+            
+        }
+        /*
         while(pc.readable()) {
             char inByte = pc.getc();
             if(inByteCnt > TRANSFER_SIZE+2) {
@@ -41,15 +58,64 @@
                 inByteCnt = 0;
                 break;
             } else if(inByte == '\0') {
-                buf[inByteCnt] = '\0';
-                printf("Command: %s\r\n", buf);
-                nrf.write(NRF24L01P_PIPE_P0, buf, TRANSFER_SIZE);
+                buffer[inByteCnt] = '\0';
+                printf("Command: %s\r\n", buffer);
+                nrf.write(NRF24L01P_PIPE_P0, buffer, TRANSFER_SIZE);
                 inByteCnt=0;
             } else {
-                buf[inByteCnt++] = inByte;
+                buffer[inByteCnt++] = inByte;
+            }
+        }*/
+    }
+}
+
+char* inspectData(char *buffer, int buf_len)
+{
+    int start, end;
+    for(int i=0; buffer[i-1]!=DATA_PROTOCOL_BEGIN; i++) {
+        start = i;
+        if(i==buf_len) return 0;
+    }
+    for(int i=start+1; buffer[i-1]!=DATA_PROTOCOL_END; i++) {
+        end = i;
+        if(i==buf_len) return 0;
+    }
+    int data_len = end-start+1;
+    
+    char *str = (char*)malloc(sizeof(char)*(data_len+1));
+    memset(str, NULL, data_len+1);
+    for(int i=0; i<data_len+1; i++){
+        *(str+i) = buffer[start+i];
+    }
+    return str;
+}
+
+int readSerialUntil(char *buffer, unsigned int buf_len, char term)
+{
+    int n=0;
+    char *str = (char*)malloc(sizeof(char)*buf_len);
+    memset(str, NULL, buf_len);
+    Timer t;
+    t.start();
+    int begin = t.read_ms();
+    while(t.read_ms()-begin < 100) {
+        if(pc.readable()) {
+            char inByte=pc.getc();
+            *(str+n)=inByte;
+            n++;
+            if(inByte == term) {
+                strcpy(buffer, str);
+                free(str);
+                return n;
+            }
+            if(n>buf_len) {
+                free(str);
+                return -1;
             }
         }
     }
+    free(str);
+    return 0;
 }
 
 void dumpRFInfo()