UD-GS01治具の試作プログラムです
Dependencies: mbed nRF24L01P SDFileSystem
Diff: Goto_UD-GS01.cpp
- 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;