うごかないよ

Dependencies:   mbed

Revision:
0:39e4e38c83a5
Child:
1:a2d4425c540b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 31 10:54:16 2015 +0000
@@ -0,0 +1,149 @@
+
+
+#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;
+    }
\ No newline at end of file