Keiju Nakano
/
mbed1114_shakehands_host_standard
うごかないよ
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; }