Keiju Nakano
/
mbed1114_shakehands_host_standard
うごかないよ
main.cpp@1:a2d4425c540b, 2015-05-01 (annotated)
- Committer:
- maxonK
- Date:
- Fri May 01 08:16:34 2015 +0000
- Revision:
- 1:a2d4425c540b
- Parent:
- 0:39e4e38c83a5
??????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maxonK | 0:39e4e38c83a5 | 1 | |
maxonK | 0:39e4e38c83a5 | 2 | |
maxonK | 0:39e4e38c83a5 | 3 | #include "mbed.h" |
maxonK | 0:39e4e38c83a5 | 4 | #include "stdlib.h" |
maxonK | 1:a2d4425c540b | 5 | #include "stdio.h" |
maxonK | 1:a2d4425c540b | 6 | #include <string.h> |
maxonK | 0:39e4e38c83a5 | 7 | |
maxonK | 0:39e4e38c83a5 | 8 | //文字列受信関数プロトタイプ宣言 |
maxonK | 0:39e4e38c83a5 | 9 | int stringReceive(void); |
maxonK | 1:a2d4425c540b | 10 | //float cramp関数プロトタイプ宣言 |
maxonK | 1:a2d4425c540b | 11 | float fCramp(float,float,float); |
maxonK | 1:a2d4425c540b | 12 | //serialハードウェアバッファクリア関数プロトタイプ宣言 |
maxonK | 1:a2d4425c540b | 13 | void bufferClear (void); |
maxonK | 0:39e4e38c83a5 | 14 | |
maxonK | 0:39e4e38c83a5 | 15 | DigitalOut myled(LED1); |
maxonK | 0:39e4e38c83a5 | 16 | PwmOut pwmLed(dp1); |
maxonK | 0:39e4e38c83a5 | 17 | |
maxonK | 0:39e4e38c83a5 | 18 | //シリアル初期化 |
maxonK | 0:39e4e38c83a5 | 19 | Serial sensSerial (dp16, dp15); |
maxonK | 1:a2d4425c540b | 20 | //I2C初期化 |
maxonK | 1:a2d4425c540b | 21 | I2C i2c(dp5 , dp27 ); //sda scl |
maxonK | 1:a2d4425c540b | 22 | const int addr = 0x20 << 1; // I2C address |
maxonK | 0:39e4e38c83a5 | 23 | |
maxonK | 0:39e4e38c83a5 | 24 | int main() { |
maxonK | 0:39e4e38c83a5 | 25 | //setup |
maxonK | 0:39e4e38c83a5 | 26 | sensSerial.baud(9600);//シリアル通信開く |
maxonK | 0:39e4e38c83a5 | 27 | //(switchmbed基板でUSB通信するときは低速に抑えること) |
maxonK | 1:a2d4425c540b | 28 | float gain = 100.0f;//ゲイン |
maxonK | 1:a2d4425c540b | 29 | pwmLed.period(0.020);//PWM周期20ms |
maxonK | 1:a2d4425c540b | 30 | pwmLed = 0.0f; |
maxonK | 0:39e4e38c83a5 | 31 | myled = 0; |
maxonK | 1:a2d4425c540b | 32 | |
maxonK | 0:39e4e38c83a5 | 33 | //mainloop |
maxonK | 0:39e4e38c83a5 | 34 | while(1){ |
maxonK | 1:a2d4425c540b | 35 | int val = 123; |
maxonK | 0:39e4e38c83a5 | 36 | int receiveVal = 0; |
maxonK | 1:a2d4425c540b | 37 | float pwmVal = 0.0f; |
maxonK | 0:39e4e38c83a5 | 38 | receiveVal = stringReceive(); |
maxonK | 1:a2d4425c540b | 39 | |
maxonK | 1:a2d4425c540b | 40 | //I2C送信バッファ |
maxonK | 1:a2d4425c540b | 41 | char cmd[10] = {'\0'}; |
maxonK | 1:a2d4425c540b | 42 | //int to asic2(sprintf関数) |
maxonK | 1:a2d4425c540b | 43 | sprintf(cmd ,"%4d",/*1939*/receiveVal);//格納する配列アドレス , 書式文字列 |
maxonK | 1:a2d4425c540b | 44 | //null終端 |
maxonK | 1:a2d4425c540b | 45 | cmd[sizeof(cmd) - 1] = '\0'; /* NULL 終端する */ |
maxonK | 1:a2d4425c540b | 46 | //書き出し |
maxonK | 1:a2d4425c540b | 47 | i2c.write(addr, cmd, 7); |
maxonK | 1:a2d4425c540b | 48 | |
maxonK | 1:a2d4425c540b | 49 | if(receiveVal >= 0){ |
maxonK | 1:a2d4425c540b | 50 | //I2C送信バッファ |
maxonK | 1:a2d4425c540b | 51 | char cmd[10] = {'\0'}; |
maxonK | 1:a2d4425c540b | 52 | //int to asic2(sprintf関数) |
maxonK | 1:a2d4425c540b | 53 | sprintf(cmd ,"val : %4d",/*1939*/receiveVal);//格納する配列アドレス , 書式文字列 |
maxonK | 1:a2d4425c540b | 54 | //null終端 |
maxonK | 1:a2d4425c540b | 55 | cmd[sizeof(cmd) - 1] = '\0'; /* NULL 終端する */ |
maxonK | 1:a2d4425c540b | 56 | //書き出し |
maxonK | 1:a2d4425c540b | 57 | //i2c.write(addr, cmd, 5); |
maxonK | 1:a2d4425c540b | 58 | wait(0.5); |
maxonK | 0:39e4e38c83a5 | 59 | } |
maxonK | 1:a2d4425c540b | 60 | |
maxonK | 0:39e4e38c83a5 | 61 | } |
maxonK | 0:39e4e38c83a5 | 62 | |
maxonK | 0:39e4e38c83a5 | 63 | } |
maxonK | 0:39e4e38c83a5 | 64 | |
maxonK | 0:39e4e38c83a5 | 65 | |
maxonK | 0:39e4e38c83a5 | 66 | //受信関数 |
maxonK | 0:39e4e38c83a5 | 67 | //受信完了時0~4095 |
maxonK | 0:39e4e38c83a5 | 68 | int stringReceive(){ |
maxonK | 0:39e4e38c83a5 | 69 | //各種定数 |
maxonK | 0:39e4e38c83a5 | 70 | //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用 |
maxonK | 1:a2d4425c540b | 71 | const int dataLength = 7;//7個(6個のデータ+null終端)(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する) |
maxonK | 0:39e4e38c83a5 | 72 | //startbitに使用する文字 |
maxonK | 0:39e4e38c83a5 | 73 | char startbitChar = '*'; |
maxonK | 0:39e4e38c83a5 | 74 | //stopbitに使用する文字 |
maxonK | 0:39e4e38c83a5 | 75 | char stopbitChar = '#'; |
maxonK | 0:39e4e38c83a5 | 76 | //各種変数 |
maxonK | 0:39e4e38c83a5 | 77 | //現在書き込むべきバッファの位置変数 |
maxonK | 0:39e4e38c83a5 | 78 | static int stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 79 | //受信値一時格納変数 |
maxonK | 0:39e4e38c83a5 | 80 | char receiveChar = '\0'; |
maxonK | 0:39e4e38c83a5 | 81 | //受信データ格納バッファ文字列 |
maxonK | 1:a2d4425c540b | 82 | static char receiveDataString [dataLength] = {'\0'};//7個 |
maxonK | 0:39e4e38c83a5 | 83 | |
maxonK | 0:39e4e38c83a5 | 84 | |
maxonK | 0:39e4e38c83a5 | 85 | //データ送信要求 |
maxonK | 0:39e4e38c83a5 | 86 | sensSerial.putc('C'); |
maxonK | 0:39e4e38c83a5 | 87 | //ハードウェアバッファに到着した情報があるか |
maxonK | 0:39e4e38c83a5 | 88 | //空ならリターン、あるなら受信値格納用変数にうつす |
maxonK | 0:39e4e38c83a5 | 89 | if(!sensSerial.readable()){ |
maxonK | 0:39e4e38c83a5 | 90 | //空のとき |
maxonK | 0:39e4e38c83a5 | 91 | return -1; |
maxonK | 0:39e4e38c83a5 | 92 | }else{//あるとき |
maxonK | 0:39e4e38c83a5 | 93 | receiveChar = sensSerial.getc(); |
maxonK | 0:39e4e38c83a5 | 94 | } |
maxonK | 0:39e4e38c83a5 | 95 | //バッファ書き込み位置変数が大きくなりすぎている |
maxonK | 0:39e4e38c83a5 | 96 | //(ストップビットがくるはずがきてない)ときリターン |
maxonK | 1:a2d4425c540b | 97 | if(stringPosition > (dataLength - 2)){ |
maxonK | 0:39e4e38c83a5 | 98 | stringPosition = 0; |
maxonK | 1:a2d4425c540b | 99 | //ハードウェアバッファクリア |
maxonK | 1:a2d4425c540b | 100 | bufferClear(); |
maxonK | 0:39e4e38c83a5 | 101 | return -2; |
maxonK | 0:39e4e38c83a5 | 102 | } |
maxonK | 0:39e4e38c83a5 | 103 | |
maxonK | 0:39e4e38c83a5 | 104 | //到着していたデータがスタートビットだった場合 |
maxonK | 0:39e4e38c83a5 | 105 | if(receiveChar == startbitChar){ |
maxonK | 1:a2d4425c540b | 106 | |
maxonK | 0:39e4e38c83a5 | 107 | //バッファクリア |
maxonK | 1:a2d4425c540b | 108 | for (int i = 0;i < dataLength;i++){//配列の要素は0~ 大きさは1~ |
maxonK | 0:39e4e38c83a5 | 109 | receiveDataString[i] = '\0'; |
maxonK | 0:39e4e38c83a5 | 110 | } |
maxonK | 0:39e4e38c83a5 | 111 | //書き込み位置変数クリア |
maxonK | 0:39e4e38c83a5 | 112 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 113 | //バッファへ書き込み |
maxonK | 0:39e4e38c83a5 | 114 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 1:a2d4425c540b | 115 | |
maxonK | 1:a2d4425c540b | 116 | |
maxonK | 0:39e4e38c83a5 | 117 | //書き込み位置進め |
maxonK | 1:a2d4425c540b | 118 | stringPosition ++; |
maxonK | 0:39e4e38c83a5 | 119 | //-1リターン |
maxonK | 0:39e4e38c83a5 | 120 | return -3; |
maxonK | 0:39e4e38c83a5 | 121 | } |
maxonK | 0:39e4e38c83a5 | 122 | |
maxonK | 0:39e4e38c83a5 | 123 | //到着していたデータが数字だった場合 |
maxonK | 0:39e4e38c83a5 | 124 | if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9'){ |
maxonK | 0:39e4e38c83a5 | 125 | //バッファへ書き込み |
maxonK | 0:39e4e38c83a5 | 126 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 1:a2d4425c540b | 127 | |
maxonK | 0:39e4e38c83a5 | 128 | //書き込み位置進め |
maxonK | 0:39e4e38c83a5 | 129 | stringPosition++; |
maxonK | 0:39e4e38c83a5 | 130 | //-1リターン |
maxonK | 0:39e4e38c83a5 | 131 | return -4; |
maxonK | 0:39e4e38c83a5 | 132 | } |
maxonK | 0:39e4e38c83a5 | 133 | |
maxonK | 0:39e4e38c83a5 | 134 | //到着していたデータがストップビットだった場合 |
maxonK | 0:39e4e38c83a5 | 135 | if(receiveChar == stopbitChar){ |
maxonK | 0:39e4e38c83a5 | 136 | //使う変数宣言 |
maxonK | 0:39e4e38c83a5 | 137 | //バッファ内容をコピーするための文字列 |
maxonK | 0:39e4e38c83a5 | 138 | char copyString [dataLength] = {'\0'}; |
maxonK | 0:39e4e38c83a5 | 139 | //スタート、ストップビットをトリムしたデータだけの文字列 |
maxonK | 0:39e4e38c83a5 | 140 | char trimString [dataLength] = {'\0'}; |
maxonK | 0:39e4e38c83a5 | 141 | //文字列→数値変換後の値を格納する変数 |
maxonK | 0:39e4e38c83a5 | 142 | int intVal = 0; |
maxonK | 1:a2d4425c540b | 143 | |
maxonK | 0:39e4e38c83a5 | 144 | //バッファへ書き込み |
maxonK | 0:39e4e38c83a5 | 145 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 1:a2d4425c540b | 146 | //null終端 |
maxonK | 1:a2d4425c540b | 147 | copyString[sizeof(copyString) - 1] = '\0'; /* NULL 終端する */ |
maxonK | 1:a2d4425c540b | 148 | receiveDataString[sizeof(receiveDataString) - 1] = '\0';//null終端 |
maxonK | 1:a2d4425c540b | 149 | |
maxonK | 1:a2d4425c540b | 150 | |
maxonK | 0:39e4e38c83a5 | 151 | //バッファの内容をうつす |
maxonK | 1:a2d4425c540b | 152 | strlcpy(copyString,receiveDataString,sizeof(copyString)); |
maxonK | 0:39e4e38c83a5 | 153 | //バッファクリア |
maxonK | 1:a2d4425c540b | 154 | for (int i = 0;i < dataLength;i++){//配列の要素は0~ 大きさは1~ |
maxonK | 0:39e4e38c83a5 | 155 | receiveDataString[i] = '\0'; |
maxonK | 0:39e4e38c83a5 | 156 | } |
maxonK | 1:a2d4425c540b | 157 | //ハードウェアバッファクリア |
maxonK | 1:a2d4425c540b | 158 | bufferClear(); |
maxonK | 0:39e4e38c83a5 | 159 | //書き込み位置クリア |
maxonK | 0:39e4e38c83a5 | 160 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 161 | |
maxonK | 0:39e4e38c83a5 | 162 | //以下チェックとAtoI |
maxonK | 0:39e4e38c83a5 | 163 | //先頭がスタートビットになってるか |
maxonK | 1:a2d4425c540b | 164 | if(!(copyString[0] == startbitChar)){ |
maxonK | 0:39e4e38c83a5 | 165 | return -5; |
maxonK | 0:39e4e38c83a5 | 166 | } |
maxonK | 1:a2d4425c540b | 167 | //末尾がストップビットになっているか(配列の最後はnull) |
maxonK | 1:a2d4425c540b | 168 | if(!(copyString[(dataLength - 2)] == stopbitChar)){ |
maxonK | 0:39e4e38c83a5 | 169 | return -6; |
maxonK | 0:39e4e38c83a5 | 170 | } |
maxonK | 0:39e4e38c83a5 | 171 | //データだけをトリミング |
maxonK | 1:a2d4425c540b | 172 | //1個目から、後ろから2個目まで*xxxx#(\n) |
maxonK | 1:a2d4425c540b | 173 | for(int Idx = 1; Idx < (dataLength - 2) ; Idx++){ |
maxonK | 1:a2d4425c540b | 174 | trimString[(Idx - 1) ] = copyString[Idx]; |
maxonK | 0:39e4e38c83a5 | 175 | } |
maxonK | 1:a2d4425c540b | 176 | //null終端 |
maxonK | 1:a2d4425c540b | 177 | trimString[sizeof(trimString) - 1] = '\0'; /* NULL 終端する */ |
maxonK | 0:39e4e38c83a5 | 178 | //文字列→数値 |
maxonK | 0:39e4e38c83a5 | 179 | intVal = atoi(trimString); |
maxonK | 0:39e4e38c83a5 | 180 | //数値リターン |
maxonK | 0:39e4e38c83a5 | 181 | return intVal; |
maxonK | 0:39e4e38c83a5 | 182 | |
maxonK | 0:39e4e38c83a5 | 183 | } |
maxonK | 0:39e4e38c83a5 | 184 | |
maxonK | 0:39e4e38c83a5 | 185 | |
maxonK | 0:39e4e38c83a5 | 186 | //以上にひっかからなかった異常時 |
maxonK | 0:39e4e38c83a5 | 187 | //バッファクリア |
maxonK | 0:39e4e38c83a5 | 188 | for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ |
maxonK | 0:39e4e38c83a5 | 189 | receiveDataString[i] = '\0'; |
maxonK | 0:39e4e38c83a5 | 190 | } |
maxonK | 1:a2d4425c540b | 191 | //ハードウェアバッファクリア |
maxonK | 1:a2d4425c540b | 192 | bufferClear(); |
maxonK | 0:39e4e38c83a5 | 193 | //書き込み位置クリア |
maxonK | 0:39e4e38c83a5 | 194 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 195 | //-3リターン |
maxonK | 0:39e4e38c83a5 | 196 | return -7; |
maxonK | 1:a2d4425c540b | 197 | } |
maxonK | 1:a2d4425c540b | 198 | |
maxonK | 1:a2d4425c540b | 199 | |
maxonK | 1:a2d4425c540b | 200 | //cramp関数 |
maxonK | 1:a2d4425c540b | 201 | float fCramp(float val , float min , float max){ |
maxonK | 1:a2d4425c540b | 202 | if(val < min){ |
maxonK | 1:a2d4425c540b | 203 | return min; |
maxonK | 1:a2d4425c540b | 204 | } |
maxonK | 1:a2d4425c540b | 205 | if(val > max){ |
maxonK | 1:a2d4425c540b | 206 | return max; |
maxonK | 1:a2d4425c540b | 207 | } |
maxonK | 1:a2d4425c540b | 208 | |
maxonK | 1:a2d4425c540b | 209 | return val; |
maxonK | 1:a2d4425c540b | 210 | } |
maxonK | 1:a2d4425c540b | 211 | |
maxonK | 1:a2d4425c540b | 212 | //serialハードウェアバッファクリア関数 |
maxonK | 1:a2d4425c540b | 213 | void bufferClear(void){ |
maxonK | 1:a2d4425c540b | 214 | char temp = 0; |
maxonK | 1:a2d4425c540b | 215 | while(sensSerial.readable()){ |
maxonK | 1:a2d4425c540b | 216 | temp = sensSerial.getc(); |
maxonK | 1:a2d4425c540b | 217 | } |
maxonK | 1:a2d4425c540b | 218 | return; |
maxonK | 0:39e4e38c83a5 | 219 | } |