no

Dependencies:   mbed nRF24L01P

Fork of nRF24L01P_Hello_World by YX ZHANG

main.cpp

Committer:
brainliang
Date:
2017-06-02
Revision:
3:6be25aa4e69d
Parent:
2:1199904d820e

File content as of revision 3:6be25aa4e69d:

/*
本程序实验时,注意将串口调试助手的波特率修改为115200
实验证明:SPI通讯硬件连接中,mosi,miso,sck是专用引脚.而csn,ce,irq都是用的引脚的GPIO功能.
试验中,将本例的D7换成了D12,D8换成了D11,D6换成了D13,实验没有问题.
*/
#include "mbed.h"
#include "nRF24L01P.h"

Serial pc(USBTX, USBRX, 115200); // tx, rx,波特率115200
/*USBTX--PA_2,USBRX--PA_3*/

nRF24L01P my_nrf24l01p(D4, D5, D3, D7, D8, D6);    // mosi, miso, sck, csn, ce, irq   用SPI1通讯, D3灯这种命名方法是根据网站mbed引脚地图中的绿色框得到的,具体见PinNames.h
/*D3--PB_3,D4--PB_5,D5--PB_4,D6--PB_10,D7--PA_8,D8--PA9*/

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
/*LED1--PA_5,LED2--PA_5*/

int main() {
    
    pc.printf("init\r\n");
    
    
    typedef signed char s8;
    s8 Direction = 100,Speed = 100,steer1 = 50,steer2 = 50,steer3 = 50,steer4 = 50;    //typedef int8_t s8:-128~127
    s8 DirectionGoal,SpeedGoal,steer1Goal,steer2Goal,steer3Goal,steer4Goal;    //typedef int8_t s8:-128~127
    //extern Serial bluetoothreceive;
    typedef enum
    {
        CheckS,CheckW,Checka,Checkb,Checkc,Checkd,Checke,Checkf,CheckSum, CheckOver
    }STATE;   //定义枚举类型STATE

// The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
//  "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
//  only handles 4 byte transfers in the ATMega code.
/*
nRF24L01+支持从1-32字节的传输,但是Sparkfun的"Nordic Serial Interface Board"板子在ATMega代码中,只处理4字节的传输
*/
    #define TRANSFER_SIZE   8    //每次发送的固定字节数目

    char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
    int txDataCnt = 0;
    int rxDataCnt = 0;

    my_nrf24l01p.powerUp();

    // Display the (default) setup of the nRF24L01+ chip
    //显示nRF24L01+芯片的默认设置
    pc.printf( "nRF24L01+ Frequency    : %d MHz\r\n",  my_nrf24l01p.getRfFrequency() );
    pc.printf( "nRF24L01+ Output power : %d dBm\r\n",  my_nrf24l01p.getRfOutputPower() );
    pc.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
    pc.printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
    pc.printf( "nRF24L01+ RX Address   : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );

    pc.printf( "Type keys to test transfers:\r\n  (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );

    my_nrf24l01p.setTransferSize( TRANSFER_SIZE );   //设置传输字节数
    my_nrf24l01p.setReceiveMode();   //打开接收
    my_nrf24l01p.enable();      //使能

    while (1) {

        // If we've received anything over the host serial link...如果从与主机连接的串口中接收到消息
        if ( pc.readable() ) {

            // ...add it to the transmit buffer添加到发送缓存
            txData[txDataCnt++] = pc.getc();

            // If the transmit buffer is full如果发送缓存是满的
            if ( txDataCnt >= sizeof( txData ) ) {

                // Send the transmitbuffer via the nRF24L01+
                my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt );    //发送,这是发送用的函数.txData是发送的内容,txDataCnt是发送的字节数

                txDataCnt = 0;    //计数清零
            }

            // Toggle LED1 (to help debug Host -> nRF24L01+ communication)切换LED1(帮助调试主机->nRF24L01+的通讯)
            myled1 = !myled1;
        }

        // If we've received anything in the nRF24L01+...如果在nRF24L01+中接收到消息
        if ( my_nrf24l01p.readable() ) {

            // ...read the data into the receive buffer将接收到的消息读入接收缓存
            rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );   //接收,这是接收函数,rxData是接收的内容,后面跟着接收的字节数.   问题:赋值给rxDataCnt的目的是什么???

            // Display the receive buffer contents via the host serial link通过主机串口连接显示接收缓存中的内容
            
//            int counter = 0;
            bool flag = false;
            s8 u1Rec; 
            static STATE State = CheckS;// 初始状态待检查
            static s8 PositionTemp[5]={0,0,0,0,0};// 装载数据值a(左右转)b(前后退)c d e f舵机转动角度sum(求和校验)
            
            
            
            for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
                
                pc.putc( rxData[i] );  //打印到串口
                
                
                switch(State)
                {
                case CheckS:
                    if(u1Rec==(s8)'S'){
                        State=CheckW;//准备跳转至数据读取
                    }else
                        State=CheckS;
                        break;
                case CheckW:
                    if(u1Rec==(s8)'W'){
                        State=Checka;
                    }else if(u1Rec==(s8)'S')
                            State=CheckW;
                        else 
                            State=CheckS;
                            break;
                case Checka:
                    PositionTemp[0]=u1Rec;
                    State=Checkb;
                    break;
                case Checkb:
                    PositionTemp[1]=u1Rec;
                    State=Checkc;
                    break;
                case Checkc:
                    PositionTemp[2]=u1Rec;
                    State=Checkd;
                    break;
                case Checkd:
                    PositionTemp[3]=u1Rec;
                    State=Checke;
                    break;
//                case Checke:
//                    PositionTemp[4]=u1Rec;
//                    State=Checkf;
//                    break;
//                case Checkf:
//                    PositionTemp[5]=u1Rec;
//                    State=CheckSum;
//                    break;
                case CheckSum:
                    PositionTemp[4]=u1Rec;
                    State=CheckOver;
                    break;
                case CheckOver:
                    if(u1Rec==(s8)'E'){
                        State=CheckS;//准备跳转至数据读取
                    } else {
                        State=CheckS;
                        break;
                    }
                    if(PositionTemp[4]==(s8)(PositionTemp[0]+PositionTemp[1]+PositionTemp[2]+PositionTemp[3]))
                    {
                        DirectionGoal = PositionTemp[0];
                        SpeedGoal     = PositionTemp[1];
                        steer1Goal    = PositionTemp[2];
                        steer2Goal    = PositionTemp[3];
//                        steer3Goal    = PositionTemp[4];
//                        steer4Goal    = PositionTemp[5];
//                        pc.printf("E\n");     //调试用,用于显示程序是否运行到这里
//                        pc.printf("Speed: %d \n", Speed);     //调试用,用于显示程序是否 正确接收到数据
//                        pc.printf("steer1: %d \n", steer1);
//                        pc.printf("steer2: %d \n", steer2);
//                        pc.printf("steer3: %d \n", steer3);
//                        pc.printf("steer4: %d \n", steer4);
                            flag = true;      //状态判断,用于判断蓝牙串口是否接收到控制指令
                    }
                    break; 
                default:
                    State=CheckS;
                    break;
            }

            // Toggle LED2 (to help debug nRF24L01+ -> Host communication)切换LED2(帮助调试nRF24L01+->主机的通讯)
            myled2 = !myled2;
        }
    }
}
}