Keiju Nakano
/
mbed1114_shakehands_host_standard
うごかないよ
Diff: main.cpp
- Revision:
- 1:a2d4425c540b
- Parent:
- 0:39e4e38c83a5
diff -r 39e4e38c83a5 -r a2d4425c540b main.cpp --- a/main.cpp Tue Mar 31 10:54:16 2015 +0000 +++ b/main.cpp Fri May 01 08:16:34 2015 +0000 @@ -2,31 +2,62 @@ #include "mbed.h" #include "stdlib.h" +#include "stdio.h" +#include <string.h> //文字列受信関数プロトタイプ宣言 int stringReceive(void); +//float cramp関数プロトタイプ宣言 +float fCramp(float,float,float); +//serialハードウェアバッファクリア関数プロトタイプ宣言 +void bufferClear (void); DigitalOut myled(LED1); PwmOut pwmLed(dp1); //シリアル初期化 Serial sensSerial (dp16, dp15); +//I2C初期化 +I2C i2c(dp5 , dp27 ); //sda scl +const int addr = 0x20 << 1; // I2C address int main() { //setup sensSerial.baud(9600);//シリアル通信開く //(switchmbed基板でUSB通信するときは低速に抑えること) + float gain = 100.0f;//ゲイン + pwmLed.period(0.020);//PWM周期20ms + pwmLed = 0.0f; myled = 0; + //mainloop while(1){ + int val = 123; int receiveVal = 0; - float pwmVal = 0; + float pwmVal = 0.0f; receiveVal = stringReceive(); - if(0 <= receiveVal){ - myled = 1; - pwmVal = receiveVal/4095.0f; - pwmLed = pwmVal; + +//I2C送信バッファ + char cmd[10] = {'\0'}; + //int to asic2(sprintf関数) + sprintf(cmd ,"%4d",/*1939*/receiveVal);//格納する配列アドレス , 書式文字列 + //null終端 + cmd[sizeof(cmd) - 1] = '\0'; /* NULL 終端する */ + //書き出し + i2c.write(addr, cmd, 7); + + if(receiveVal >= 0){ + //I2C送信バッファ + char cmd[10] = {'\0'}; + //int to asic2(sprintf関数) + sprintf(cmd ,"val : %4d",/*1939*/receiveVal);//格納する配列アドレス , 書式文字列 + //null終端 + cmd[sizeof(cmd) - 1] = '\0'; /* NULL 終端する */ + //書き出し + //i2c.write(addr, cmd, 5); + wait(0.5); } + } } @@ -37,7 +68,7 @@ int stringReceive(){ //各種定数 //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用 - const int dataLength = 6;//6個(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する) + const int dataLength = 7;//7個(6個のデータ+null終端)(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する) //startbitに使用する文字 char startbitChar = '*'; //stopbitに使用する文字 @@ -48,7 +79,7 @@ //受信値一時格納変数 char receiveChar = '\0'; //受信データ格納バッファ文字列 - static char receiveDataString [dataLength] = {'\0'};//6個 + static char receiveDataString [dataLength] = {'\0'};//7個 //データ送信要求 @@ -63,23 +94,28 @@ } //バッファ書き込み位置変数が大きくなりすぎている //(ストップビットがくるはずがきてない)ときリターン - if(stringPosition > (dataLength-1)){ + if(stringPosition > (dataLength - 2)){ stringPosition = 0; + //ハードウェアバッファクリア + bufferClear(); return -2; } //到着していたデータがスタートビットだった場合 if(receiveChar == startbitChar){ + //バッファクリア - for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ + for (int i = 0;i < dataLength;i++){//配列の要素は0~ 大きさは1~ receiveDataString[i] = '\0'; } //書き込み位置変数クリア stringPosition = 0; //バッファへ書き込み receiveDataString[stringPosition] = receiveChar ; + + //書き込み位置進め - stringPosition++; + stringPosition ++; //-1リターン return -3; } @@ -88,6 +124,7 @@ 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リターン @@ -103,32 +140,41 @@ char trimString [dataLength] = {'\0'}; //文字列→数値変換後の値を格納する変数 int intVal = 0; - + //バッファへ書き込み receiveDataString[stringPosition] = receiveChar ; + //null終端 + copyString[sizeof(copyString) - 1] = '\0'; /* NULL 終端する */ + receiveDataString[sizeof(receiveDataString) - 1] = '\0';//null終端 + + //バッファの内容をうつす - strcpy(copyString,receiveDataString); + strlcpy(copyString,receiveDataString,sizeof(copyString)); //バッファクリア - for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ + for (int i = 0;i < dataLength;i++){//配列の要素は0~ 大きさは1~ receiveDataString[i] = '\0'; } + //ハードウェアバッファクリア + bufferClear(); //書き込み位置クリア stringPosition = 0; //以下チェックとAtoI //先頭がスタートビットになってるか - if(!copyString[0] == startbitChar){ + if(!(copyString[0] == startbitChar)){ return -5; } - //末尾がストップビットになっているか - if(!copyString[dataLength-1] == stopbitChar){ + //末尾がストップビットになっているか(配列の最後はnull) + if(!(copyString[(dataLength - 2)] == stopbitChar)){ return -6; } //データだけをトリミング - //1個目から、後ろから1個目まで - for(int Idx = 1; Idx <= dataLength -2 ; Idx++){ - trimString[Idx-1] = copyString[Idx]; + //1個目から、後ろから2個目まで*xxxx#(\n) + for(int Idx = 1; Idx < (dataLength - 2) ; Idx++){ + trimString[(Idx - 1) ] = copyString[Idx]; } + //null終端 + trimString[sizeof(trimString) - 1] = '\0'; /* NULL 終端する */ //文字列→数値 intVal = atoi(trimString); //数値リターン @@ -142,8 +188,32 @@ for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ receiveDataString[i] = '\0'; } + //ハードウェアバッファクリア + bufferClear(); //書き込み位置クリア stringPosition = 0; //-3リターン return -7; + } + + +//cramp関数 +float fCramp(float val , float min , float max){ + if(val < min){ + return min; + } + if(val > max){ + return max; + } + + return val; + } + +//serialハードウェアバッファクリア関数 +void bufferClear(void){ + char temp = 0; + while(sensSerial.readable()){ + temp = sensSerial.getc(); + } + return; } \ No newline at end of file