うごかないよ

Dependencies:   mbed

main.cpp

Committer:
maxonK
Date:
2015-03-31
Revision:
0:39e4e38c83a5
Child:
1:a2d4425c540b

File content as of revision 0:39e4e38c83a5:



#include "mbed.h"
#include "stdlib.h"

//文字列受信関数プロトタイプ宣言
int stringReceive(void);

DigitalOut myled(LED1);
PwmOut pwmLed(dp1);

//シリアル初期化
Serial sensSerial (dp16, dp15);

int main() {
    //setup
    sensSerial.baud(9600);//シリアル通信開く
                  //(switchmbed基板でUSB通信するときは低速に抑えること)
    myled = 0;
    //mainloop
    while(1){
        int receiveVal = 0;
        float pwmVal = 0;
        receiveVal = stringReceive();
        if(0 <= receiveVal){
            myled = 1;
            pwmVal = receiveVal/4095.0f;
            pwmLed = pwmVal;
            }
        }
 
}


//受信関数
//受信完了時0~4095
int stringReceive(){
    //各種定数
    //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用
    const int dataLength = 6;//6個(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する)
    //startbitに使用する文字
    char startbitChar = '*';
    //stopbitに使用する文字
    char stopbitChar = '#';
    //各種変数
    //現在書き込むべきバッファの位置変数
    static int stringPosition = 0;
    //受信値一時格納変数
    char receiveChar = '\0';
    //受信データ格納バッファ文字列
    static char receiveDataString [dataLength] = {'\0'};//6個

    
    //データ送信要求
    sensSerial.putc('C');
    //ハードウェアバッファに到着した情報があるか
    //空ならリターン、あるなら受信値格納用変数にうつす
    if(!sensSerial.readable()){
        //空のとき
        return -1;
        }else{//あるとき
                receiveChar = sensSerial.getc();
            } 
    //バッファ書き込み位置変数が大きくなりすぎている
    //(ストップビットがくるはずがきてない)ときリターン
    if(stringPosition > (dataLength-1)){
        stringPosition = 0;
        return -2;
        }
        
    //到着していたデータがスタートビットだった場合
    if(receiveChar == startbitChar){
        //バッファクリア
        for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~
            receiveDataString[i] = '\0';
            }
        //書き込み位置変数クリア
        stringPosition = 0;
        //バッファへ書き込み
        receiveDataString[stringPosition] = receiveChar ;
        //書き込み位置進め
        stringPosition++;
        //-1リターン
        return -3;
        }
    
    //到着していたデータが数字だった場合
    if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9'){
        //バッファへ書き込み
        receiveDataString[stringPosition] = receiveChar ;
        //書き込み位置進め
        stringPosition++;
        //-1リターン
        return -4;
        }
    
    //到着していたデータがストップビットだった場合
    if(receiveChar == stopbitChar){
        //使う変数宣言
        //バッファ内容をコピーするための文字列
        char copyString [dataLength] = {'\0'};
        //スタート、ストップビットをトリムしたデータだけの文字列
        char trimString [dataLength] = {'\0'};
        //文字列→数値変換後の値を格納する変数
        int intVal = 0;
        
        //バッファへ書き込み
        receiveDataString[stringPosition] = receiveChar ;
        //バッファの内容をうつす
        strcpy(copyString,receiveDataString);
        //バッファクリア
         for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~
            receiveDataString[i] = '\0';
            }
        //書き込み位置クリア
        stringPosition = 0;
        
        //以下チェックとAtoI
        //先頭がスタートビットになってるか
        if(!copyString[0] == startbitChar){
            return -5;
            }
        //末尾がストップビットになっているか
        if(!copyString[dataLength-1] == stopbitChar){
            return -6;
            }
        //データだけをトリミング
        //1個目から、後ろから1個目まで
        for(int Idx = 1; Idx <= dataLength -2 ; Idx++){
            trimString[Idx-1] = copyString[Idx]; 
            }
        //文字列→数値
        intVal = atoi(trimString);
        //数値リターン
        return intVal;
        
        }
        
        
    //以上にひっかからなかった異常時
        //バッファクリア
         for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~
            receiveDataString[i] = '\0';
            }
        //書き込み位置クリア
        stringPosition = 0;
        //-3リターン
        return -7;
    }