liang brain / Mbed 2 deprecated Receiver_of_Controller

Dependencies:   mbed nRF24L01P

Fork of nRF24L01P_Hello_World by YX ZHANG

Committer:
brainliang
Date:
Fri Jun 02 10:30:24 2017 +0000
Revision:
3:6be25aa4e69d
Parent:
2:1199904d820e
no comment

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brainliang 3:6be25aa4e69d 1 /*
brainliang 3:6be25aa4e69d 2 本程序实验时,注意将串口调试助手的波特率修改为115200
brainliang 3:6be25aa4e69d 3 实验证明:SPI通讯硬件连接中,mosi,miso,sck是专用引脚.而csn,ce,irq都是用的引脚的GPIO功能.
brainliang 3:6be25aa4e69d 4 试验中,将本例的D7换成了D12,D8换成了D11,D6换成了D13,实验没有问题.
brainliang 3:6be25aa4e69d 5 */
Owen 0:a51a6e7da590 6 #include "mbed.h"
Owen 0:a51a6e7da590 7 #include "nRF24L01P.h"
Owen 0:a51a6e7da590 8
brainliang 3:6be25aa4e69d 9 Serial pc(USBTX, USBRX, 115200); // tx, rx,波特率115200
brainliang 3:6be25aa4e69d 10 /*USBTX--PA_2,USBRX--PA_3*/
Owen 0:a51a6e7da590 11
brainliang 3:6be25aa4e69d 12 nRF24L01P my_nrf24l01p(D4, D5, D3, D7, D8, D6); // mosi, miso, sck, csn, ce, irq 用SPI1通讯, D3灯这种命名方法是根据网站mbed引脚地图中的绿色框得到的,具体见PinNames.h
brainliang 3:6be25aa4e69d 13 /*D3--PB_3,D4--PB_5,D5--PB_4,D6--PB_10,D7--PA_8,D8--PA9*/
Owen 0:a51a6e7da590 14
Owen 0:a51a6e7da590 15 DigitalOut myled1(LED1);
Owen 0:a51a6e7da590 16 DigitalOut myled2(LED2);
brainliang 3:6be25aa4e69d 17 /*LED1--PA_5,LED2--PA_5*/
Owen 0:a51a6e7da590 18
Owen 0:a51a6e7da590 19 int main() {
zhangyx 2:1199904d820e 20
zhangyx 2:1199904d820e 21 pc.printf("init\r\n");
brainliang 3:6be25aa4e69d 22
brainliang 3:6be25aa4e69d 23
brainliang 3:6be25aa4e69d 24 typedef signed char s8;
brainliang 3:6be25aa4e69d 25 s8 Direction = 100,Speed = 100,steer1 = 50,steer2 = 50,steer3 = 50,steer4 = 50; //typedef int8_t s8:-128~127
brainliang 3:6be25aa4e69d 26 s8 DirectionGoal,SpeedGoal,steer1Goal,steer2Goal,steer3Goal,steer4Goal; //typedef int8_t s8:-128~127
brainliang 3:6be25aa4e69d 27 //extern Serial bluetoothreceive;
brainliang 3:6be25aa4e69d 28 typedef enum
brainliang 3:6be25aa4e69d 29 {
brainliang 3:6be25aa4e69d 30 CheckS,CheckW,Checka,Checkb,Checkc,Checkd,Checke,Checkf,CheckSum, CheckOver
brainliang 3:6be25aa4e69d 31 }STATE; //定义枚举类型STATE
Owen 0:a51a6e7da590 32
Owen 0:a51a6e7da590 33 // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
Owen 0:a51a6e7da590 34 // "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
Owen 0:a51a6e7da590 35 // only handles 4 byte transfers in the ATMega code.
brainliang 3:6be25aa4e69d 36 /*
brainliang 3:6be25aa4e69d 37 nRF24L01+支持从1-32字节的传输,但是Sparkfun的"Nordic Serial Interface Board"板子在ATMega代码中,只处理4字节的传输
brainliang 3:6be25aa4e69d 38 */
brainliang 3:6be25aa4e69d 39 #define TRANSFER_SIZE 8 //每次发送的固定字节数目
Owen 0:a51a6e7da590 40
Owen 0:a51a6e7da590 41 char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
Owen 0:a51a6e7da590 42 int txDataCnt = 0;
Owen 0:a51a6e7da590 43 int rxDataCnt = 0;
Owen 0:a51a6e7da590 44
Owen 0:a51a6e7da590 45 my_nrf24l01p.powerUp();
Owen 0:a51a6e7da590 46
Owen 0:a51a6e7da590 47 // Display the (default) setup of the nRF24L01+ chip
brainliang 3:6be25aa4e69d 48 //显示nRF24L01+芯片的默认设置
Owen 0:a51a6e7da590 49 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
Owen 0:a51a6e7da590 50 pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() );
Owen 0:a51a6e7da590 51 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
Owen 0:a51a6e7da590 52 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
Owen 0:a51a6e7da590 53 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
Owen 0:a51a6e7da590 54
Owen 0:a51a6e7da590 55 pc.printf( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
Owen 0:a51a6e7da590 56
brainliang 3:6be25aa4e69d 57 my_nrf24l01p.setTransferSize( TRANSFER_SIZE ); //设置传输字节数
brainliang 3:6be25aa4e69d 58 my_nrf24l01p.setReceiveMode(); //打开接收
brainliang 3:6be25aa4e69d 59 my_nrf24l01p.enable(); //使能
Owen 0:a51a6e7da590 60
Owen 0:a51a6e7da590 61 while (1) {
Owen 0:a51a6e7da590 62
brainliang 3:6be25aa4e69d 63 // If we've received anything over the host serial link...如果从与主机连接的串口中接收到消息
Owen 0:a51a6e7da590 64 if ( pc.readable() ) {
Owen 0:a51a6e7da590 65
brainliang 3:6be25aa4e69d 66 // ...add it to the transmit buffer添加到发送缓存
Owen 0:a51a6e7da590 67 txData[txDataCnt++] = pc.getc();
Owen 0:a51a6e7da590 68
brainliang 3:6be25aa4e69d 69 // If the transmit buffer is full如果发送缓存是满的
Owen 0:a51a6e7da590 70 if ( txDataCnt >= sizeof( txData ) ) {
Owen 0:a51a6e7da590 71
Owen 0:a51a6e7da590 72 // Send the transmitbuffer via the nRF24L01+
brainliang 3:6be25aa4e69d 73 my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt ); //发送,这是发送用的函数.txData是发送的内容,txDataCnt是发送的字节数
Owen 0:a51a6e7da590 74
brainliang 3:6be25aa4e69d 75 txDataCnt = 0; //计数清零
Owen 0:a51a6e7da590 76 }
Owen 0:a51a6e7da590 77
brainliang 3:6be25aa4e69d 78 // Toggle LED1 (to help debug Host -> nRF24L01+ communication)切换LED1(帮助调试主机->nRF24L01+的通讯)
Owen 0:a51a6e7da590 79 myled1 = !myled1;
Owen 0:a51a6e7da590 80 }
Owen 0:a51a6e7da590 81
brainliang 3:6be25aa4e69d 82 // If we've received anything in the nRF24L01+...如果在nRF24L01+中接收到消息
Owen 0:a51a6e7da590 83 if ( my_nrf24l01p.readable() ) {
Owen 0:a51a6e7da590 84
brainliang 3:6be25aa4e69d 85 // ...read the data into the receive buffer将接收到的消息读入接收缓存
brainliang 3:6be25aa4e69d 86 rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) ); //接收,这是接收函数,rxData是接收的内容,后面跟着接收的字节数. 问题:赋值给rxDataCnt的目的是什么???
Owen 0:a51a6e7da590 87
brainliang 3:6be25aa4e69d 88 // Display the receive buffer contents via the host serial link通过主机串口连接显示接收缓存中的内容
brainliang 3:6be25aa4e69d 89
brainliang 3:6be25aa4e69d 90 // int counter = 0;
brainliang 3:6be25aa4e69d 91 bool flag = false;
brainliang 3:6be25aa4e69d 92 s8 u1Rec;
brainliang 3:6be25aa4e69d 93 static STATE State = CheckS;// 初始状态待检查
brainliang 3:6be25aa4e69d 94 static s8 PositionTemp[5]={0,0,0,0,0};// 装载数据值a(左右转)b(前后退)c d e f舵机转动角度sum(求和校验)
brainliang 3:6be25aa4e69d 95
brainliang 3:6be25aa4e69d 96
brainliang 3:6be25aa4e69d 97
Owen 0:a51a6e7da590 98 for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
brainliang 3:6be25aa4e69d 99
brainliang 3:6be25aa4e69d 100 pc.putc( rxData[i] ); //打印到串口
brainliang 3:6be25aa4e69d 101
brainliang 3:6be25aa4e69d 102
brainliang 3:6be25aa4e69d 103 switch(State)
brainliang 3:6be25aa4e69d 104 {
brainliang 3:6be25aa4e69d 105 case CheckS:
brainliang 3:6be25aa4e69d 106 if(u1Rec==(s8)'S'){
brainliang 3:6be25aa4e69d 107 State=CheckW;//准备跳转至数据读取
brainliang 3:6be25aa4e69d 108 }else
brainliang 3:6be25aa4e69d 109 State=CheckS;
brainliang 3:6be25aa4e69d 110 break;
brainliang 3:6be25aa4e69d 111 case CheckW:
brainliang 3:6be25aa4e69d 112 if(u1Rec==(s8)'W'){
brainliang 3:6be25aa4e69d 113 State=Checka;
brainliang 3:6be25aa4e69d 114 }else if(u1Rec==(s8)'S')
brainliang 3:6be25aa4e69d 115 State=CheckW;
brainliang 3:6be25aa4e69d 116 else
brainliang 3:6be25aa4e69d 117 State=CheckS;
brainliang 3:6be25aa4e69d 118 break;
brainliang 3:6be25aa4e69d 119 case Checka:
brainliang 3:6be25aa4e69d 120 PositionTemp[0]=u1Rec;
brainliang 3:6be25aa4e69d 121 State=Checkb;
brainliang 3:6be25aa4e69d 122 break;
brainliang 3:6be25aa4e69d 123 case Checkb:
brainliang 3:6be25aa4e69d 124 PositionTemp[1]=u1Rec;
brainliang 3:6be25aa4e69d 125 State=Checkc;
brainliang 3:6be25aa4e69d 126 break;
brainliang 3:6be25aa4e69d 127 case Checkc:
brainliang 3:6be25aa4e69d 128 PositionTemp[2]=u1Rec;
brainliang 3:6be25aa4e69d 129 State=Checkd;
brainliang 3:6be25aa4e69d 130 break;
brainliang 3:6be25aa4e69d 131 case Checkd:
brainliang 3:6be25aa4e69d 132 PositionTemp[3]=u1Rec;
brainliang 3:6be25aa4e69d 133 State=Checke;
brainliang 3:6be25aa4e69d 134 break;
brainliang 3:6be25aa4e69d 135 // case Checke:
brainliang 3:6be25aa4e69d 136 // PositionTemp[4]=u1Rec;
brainliang 3:6be25aa4e69d 137 // State=Checkf;
brainliang 3:6be25aa4e69d 138 // break;
brainliang 3:6be25aa4e69d 139 // case Checkf:
brainliang 3:6be25aa4e69d 140 // PositionTemp[5]=u1Rec;
brainliang 3:6be25aa4e69d 141 // State=CheckSum;
brainliang 3:6be25aa4e69d 142 // break;
brainliang 3:6be25aa4e69d 143 case CheckSum:
brainliang 3:6be25aa4e69d 144 PositionTemp[4]=u1Rec;
brainliang 3:6be25aa4e69d 145 State=CheckOver;
brainliang 3:6be25aa4e69d 146 break;
brainliang 3:6be25aa4e69d 147 case CheckOver:
brainliang 3:6be25aa4e69d 148 if(u1Rec==(s8)'E'){
brainliang 3:6be25aa4e69d 149 State=CheckS;//准备跳转至数据读取
brainliang 3:6be25aa4e69d 150 } else {
brainliang 3:6be25aa4e69d 151 State=CheckS;
brainliang 3:6be25aa4e69d 152 break;
brainliang 3:6be25aa4e69d 153 }
brainliang 3:6be25aa4e69d 154 if(PositionTemp[4]==(s8)(PositionTemp[0]+PositionTemp[1]+PositionTemp[2]+PositionTemp[3]))
brainliang 3:6be25aa4e69d 155 {
brainliang 3:6be25aa4e69d 156 DirectionGoal = PositionTemp[0];
brainliang 3:6be25aa4e69d 157 SpeedGoal = PositionTemp[1];
brainliang 3:6be25aa4e69d 158 steer1Goal = PositionTemp[2];
brainliang 3:6be25aa4e69d 159 steer2Goal = PositionTemp[3];
brainliang 3:6be25aa4e69d 160 // steer3Goal = PositionTemp[4];
brainliang 3:6be25aa4e69d 161 // steer4Goal = PositionTemp[5];
brainliang 3:6be25aa4e69d 162 // pc.printf("E\n"); //调试用,用于显示程序是否运行到这里
brainliang 3:6be25aa4e69d 163 // pc.printf("Speed: %d \n", Speed); //调试用,用于显示程序是否 正确接收到数据
brainliang 3:6be25aa4e69d 164 // pc.printf("steer1: %d \n", steer1);
brainliang 3:6be25aa4e69d 165 // pc.printf("steer2: %d \n", steer2);
brainliang 3:6be25aa4e69d 166 // pc.printf("steer3: %d \n", steer3);
brainliang 3:6be25aa4e69d 167 // pc.printf("steer4: %d \n", steer4);
brainliang 3:6be25aa4e69d 168 flag = true; //状态判断,用于判断蓝牙串口是否接收到控制指令
brainliang 3:6be25aa4e69d 169 }
brainliang 3:6be25aa4e69d 170 break;
brainliang 3:6be25aa4e69d 171 default:
brainliang 3:6be25aa4e69d 172 State=CheckS;
brainliang 3:6be25aa4e69d 173 break;
Owen 0:a51a6e7da590 174 }
Owen 0:a51a6e7da590 175
brainliang 3:6be25aa4e69d 176 // Toggle LED2 (to help debug nRF24L01+ -> Host communication)切换LED2(帮助调试nRF24L01+->主机的通讯)
Owen 0:a51a6e7da590 177 myled2 = !myled2;
Owen 0:a51a6e7da590 178 }
Owen 0:a51a6e7da590 179 }
Owen 0:a51a6e7da590 180 }
brainliang 3:6be25aa4e69d 181 }