Keiju Nakano
/
mbed1114_shakehands_host_standard
うごかないよ
Diff: main.cpp
- 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