UD-GS01治具の試作プログラムです

Dependencies:   mbed nRF24L01P SDFileSystem

Revision:
4:de94aef84acc
Parent:
3:fe94916d0f12
Child:
5:24ea1bd807e6
--- a/Goto_UD-GS01.cpp	Wed Dec 09 01:20:28 2020 +0000
+++ b/Goto_UD-GS01.cpp	Wed Dec 09 04:04:37 2020 +0000
@@ -3,6 +3,8 @@
 
 #include "mbed.h"
 #include "nRF24L01P.h"
+#include <assert.h>
+#include <stdbool.h>
 RawSerial  pc(PA_2, PA_3,115200);  //ここはpcとケーブルでつないだときにシリアル通信させてたところだから、ここから牛のUARTにつなぐだけで大丈夫なはず。→ここは元々ST基板のPC部分(パキッと折れそうな方)との通信用に使われてるから他のシリアルは無理らしい。
 RawSerial  UDGS01(PA_0, PA_1, 115200);        // UD-GS01とのシリアル通信用にUARTピンを新たに定義。
 Ticker     interrput;
@@ -15,7 +17,9 @@
 char txData2[TRANSFER_SIZE];    /*char型で一文字ずつ配列に入れていき、表示する。char型は一つ1バイトなので、32個ずつ溜まったら送るようにする。*/
 int      txDataIdx = 0;                 
 int      txDataCnt=0;
-char rxData[TRANSFER_SIZE*2];    /*char型で一文字ずつ配列に入れていき、表示する。char型は一つ1バイトなので、32個ずつ溜まったら送るようにする。*/
+char rxData1[TRANSFER_SIZE];
+char rxData2[TRANSFER_SIZE];     /*char型で一文字ずつ配列に入れていき、表示する。char型は一つ1バイトなので、32個ずつ溜まったら送るようにする。*/
+
 int      rxDataIdx = 0;                 
 int      rxDataCnt=0;
 int      i=0;
@@ -29,19 +33,19 @@
    uint16_t ain;
    
       
-      if(rcv_flg) {
-         out_flg=1;     
-      } 
-      if(out_flg){  
+      if(rcv_flg == 1) { 
         
-        pc.printf("%s", &rxData[rxDataIdx]);
+        pc.printf("%s", &rxData2[rxDataIdx]);
         rxDataIdx++;
-        if (rxDataIdx >= TRANSFER_SIZE*2) 
+        if (rxDataIdx >= TRANSFER_SIZE) 
         rxDataIdx=0;
-        rcv_flg = 0;
+        rcv_flg = 0;       
+      }
+      if(rcv_flg == 2) { 
         
+        pc.printf("\r\n");
+        rcv_flg = 0;    
       }
-
    //ここらへんにSDカードの書き込みを入れようかと!
 }
 
@@ -63,7 +67,28 @@
                
         }
     
-}   
+}
+
+//for文でrxData1とrxData2を比較して、まったく同じ中身なら0,違えば1を返す関数 
+bool rxData_equal(char* rxData1,/* size_t size1,*/ const char* rxData2/*, size_t size2*/)
+{
+    assert(rxData1 != NULL);
+    assert(rxData2 != NULL);
+//    assert(size1 != 0);
+//    assert(size2 != 0);
+/*
+    // 要素数が違うなら、絶対に一致しない
+    if (size1 != size2) {
+        return false;
+    }
+*/
+    for (i = 0; i < TRANSFER_SIZE; ++i) {
+        if (rxData1[i] != rxData2[i]) {
+            return false;
+        }
+    }
+    return true;
+}  
       
 int main() {
 
@@ -89,28 +114,24 @@
     wait_ms(100);
    // my_nrf24l01p.write( NRF24L01P_PIPE_P0, (char*)rxData,1);//dummy
 
-    interrput.attach(&timer, 2);//100 usec 10Khz
+    interrput.attach(&timer, 1);//100 usec 10Khz
     UDGS01.attach(recieve,Serial::RxIrq);//牛からのデータ受信したら割り込み発生してrecieveを呼び出す
 
  //   my_nrf24l01p.flush_rx_fifo();
  while(1){
        
-       if ( my_nrf24l01p.readable(NRF24L01P_PIPE_P0) ) {    //受信?
-            // ...read the data into the receive buffer
-            if (rxDataIdx < TRANSFER_SIZE){
-                 bufferidx = TRANSFER_SIZE;
-            }
-            else{
-                 bufferidx = 0;
-            }
-             
-            rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, (char*)(rxData+bufferidx),TRANSFER_SIZE );
-            //myled1 = !myled1;
-            //if (rcv_flg==0)   
-             
-            rcv_flg = 1;                                       
-       
-       } 
+       if ( my_nrf24l01p.readable(NRF24L01P_PIPE_P0) ) {    //受信可能であれば
+            
+         rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, (char*)(rxData1),TRANSFER_SIZE );
+         if(rxData_equal(rxData1, rxData2)==1){ //rxData1で読んだ値が以前コピーしたのと完全一致なら0, 違えば1を出す。              
+            
+             memcpy(rxData2, rxData1, TRANSFER_SIZE);
+             rcv_flg = 1;
+            
+         }else{
+             rcv_flg = 2;
+          }
+       }
 
        if (snd_flg==1) {//最初のバッファ
                snd_flg=0;