Keiju Nakano
/
mbed1114_shakehands_host_standard
うごかないよ
main.cpp@0:39e4e38c83a5, 2015-03-31 (annotated)
- Committer:
- maxonK
- Date:
- Tue Mar 31 10:54:16 2015 +0000
- Revision:
- 0:39e4e38c83a5
- Child:
- 1:a2d4425c540b
?????
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 | 0:39e4e38c83a5 | 5 | |
maxonK | 0:39e4e38c83a5 | 6 | //文字列受信関数プロトタイプ宣言 |
maxonK | 0:39e4e38c83a5 | 7 | int stringReceive(void); |
maxonK | 0:39e4e38c83a5 | 8 | |
maxonK | 0:39e4e38c83a5 | 9 | DigitalOut myled(LED1); |
maxonK | 0:39e4e38c83a5 | 10 | PwmOut pwmLed(dp1); |
maxonK | 0:39e4e38c83a5 | 11 | |
maxonK | 0:39e4e38c83a5 | 12 | //シリアル初期化 |
maxonK | 0:39e4e38c83a5 | 13 | Serial sensSerial (dp16, dp15); |
maxonK | 0:39e4e38c83a5 | 14 | |
maxonK | 0:39e4e38c83a5 | 15 | int main() { |
maxonK | 0:39e4e38c83a5 | 16 | //setup |
maxonK | 0:39e4e38c83a5 | 17 | sensSerial.baud(9600);//シリアル通信開く |
maxonK | 0:39e4e38c83a5 | 18 | //(switchmbed基板でUSB通信するときは低速に抑えること) |
maxonK | 0:39e4e38c83a5 | 19 | myled = 0; |
maxonK | 0:39e4e38c83a5 | 20 | //mainloop |
maxonK | 0:39e4e38c83a5 | 21 | while(1){ |
maxonK | 0:39e4e38c83a5 | 22 | int receiveVal = 0; |
maxonK | 0:39e4e38c83a5 | 23 | float pwmVal = 0; |
maxonK | 0:39e4e38c83a5 | 24 | receiveVal = stringReceive(); |
maxonK | 0:39e4e38c83a5 | 25 | if(0 <= receiveVal){ |
maxonK | 0:39e4e38c83a5 | 26 | myled = 1; |
maxonK | 0:39e4e38c83a5 | 27 | pwmVal = receiveVal/4095.0f; |
maxonK | 0:39e4e38c83a5 | 28 | pwmLed = pwmVal; |
maxonK | 0:39e4e38c83a5 | 29 | } |
maxonK | 0:39e4e38c83a5 | 30 | } |
maxonK | 0:39e4e38c83a5 | 31 | |
maxonK | 0:39e4e38c83a5 | 32 | } |
maxonK | 0:39e4e38c83a5 | 33 | |
maxonK | 0:39e4e38c83a5 | 34 | |
maxonK | 0:39e4e38c83a5 | 35 | //受信関数 |
maxonK | 0:39e4e38c83a5 | 36 | //受信完了時0~4095 |
maxonK | 0:39e4e38c83a5 | 37 | int stringReceive(){ |
maxonK | 0:39e4e38c83a5 | 38 | //各種定数 |
maxonK | 0:39e4e38c83a5 | 39 | //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用 |
maxonK | 0:39e4e38c83a5 | 40 | const int dataLength = 6;//6個(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する) |
maxonK | 0:39e4e38c83a5 | 41 | //startbitに使用する文字 |
maxonK | 0:39e4e38c83a5 | 42 | char startbitChar = '*'; |
maxonK | 0:39e4e38c83a5 | 43 | //stopbitに使用する文字 |
maxonK | 0:39e4e38c83a5 | 44 | char stopbitChar = '#'; |
maxonK | 0:39e4e38c83a5 | 45 | //各種変数 |
maxonK | 0:39e4e38c83a5 | 46 | //現在書き込むべきバッファの位置変数 |
maxonK | 0:39e4e38c83a5 | 47 | static int stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 48 | //受信値一時格納変数 |
maxonK | 0:39e4e38c83a5 | 49 | char receiveChar = '\0'; |
maxonK | 0:39e4e38c83a5 | 50 | //受信データ格納バッファ文字列 |
maxonK | 0:39e4e38c83a5 | 51 | static char receiveDataString [dataLength] = {'\0'};//6個 |
maxonK | 0:39e4e38c83a5 | 52 | |
maxonK | 0:39e4e38c83a5 | 53 | |
maxonK | 0:39e4e38c83a5 | 54 | //データ送信要求 |
maxonK | 0:39e4e38c83a5 | 55 | sensSerial.putc('C'); |
maxonK | 0:39e4e38c83a5 | 56 | //ハードウェアバッファに到着した情報があるか |
maxonK | 0:39e4e38c83a5 | 57 | //空ならリターン、あるなら受信値格納用変数にうつす |
maxonK | 0:39e4e38c83a5 | 58 | if(!sensSerial.readable()){ |
maxonK | 0:39e4e38c83a5 | 59 | //空のとき |
maxonK | 0:39e4e38c83a5 | 60 | return -1; |
maxonK | 0:39e4e38c83a5 | 61 | }else{//あるとき |
maxonK | 0:39e4e38c83a5 | 62 | receiveChar = sensSerial.getc(); |
maxonK | 0:39e4e38c83a5 | 63 | } |
maxonK | 0:39e4e38c83a5 | 64 | //バッファ書き込み位置変数が大きくなりすぎている |
maxonK | 0:39e4e38c83a5 | 65 | //(ストップビットがくるはずがきてない)ときリターン |
maxonK | 0:39e4e38c83a5 | 66 | if(stringPosition > (dataLength-1)){ |
maxonK | 0:39e4e38c83a5 | 67 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 68 | return -2; |
maxonK | 0:39e4e38c83a5 | 69 | } |
maxonK | 0:39e4e38c83a5 | 70 | |
maxonK | 0:39e4e38c83a5 | 71 | //到着していたデータがスタートビットだった場合 |
maxonK | 0:39e4e38c83a5 | 72 | if(receiveChar == startbitChar){ |
maxonK | 0:39e4e38c83a5 | 73 | //バッファクリア |
maxonK | 0:39e4e38c83a5 | 74 | for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ |
maxonK | 0:39e4e38c83a5 | 75 | receiveDataString[i] = '\0'; |
maxonK | 0:39e4e38c83a5 | 76 | } |
maxonK | 0:39e4e38c83a5 | 77 | //書き込み位置変数クリア |
maxonK | 0:39e4e38c83a5 | 78 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 79 | //バッファへ書き込み |
maxonK | 0:39e4e38c83a5 | 80 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 0:39e4e38c83a5 | 81 | //書き込み位置進め |
maxonK | 0:39e4e38c83a5 | 82 | stringPosition++; |
maxonK | 0:39e4e38c83a5 | 83 | //-1リターン |
maxonK | 0:39e4e38c83a5 | 84 | return -3; |
maxonK | 0:39e4e38c83a5 | 85 | } |
maxonK | 0:39e4e38c83a5 | 86 | |
maxonK | 0:39e4e38c83a5 | 87 | //到着していたデータが数字だった場合 |
maxonK | 0:39e4e38c83a5 | 88 | if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9'){ |
maxonK | 0:39e4e38c83a5 | 89 | //バッファへ書き込み |
maxonK | 0:39e4e38c83a5 | 90 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 0:39e4e38c83a5 | 91 | //書き込み位置進め |
maxonK | 0:39e4e38c83a5 | 92 | stringPosition++; |
maxonK | 0:39e4e38c83a5 | 93 | //-1リターン |
maxonK | 0:39e4e38c83a5 | 94 | return -4; |
maxonK | 0:39e4e38c83a5 | 95 | } |
maxonK | 0:39e4e38c83a5 | 96 | |
maxonK | 0:39e4e38c83a5 | 97 | //到着していたデータがストップビットだった場合 |
maxonK | 0:39e4e38c83a5 | 98 | if(receiveChar == stopbitChar){ |
maxonK | 0:39e4e38c83a5 | 99 | //使う変数宣言 |
maxonK | 0:39e4e38c83a5 | 100 | //バッファ内容をコピーするための文字列 |
maxonK | 0:39e4e38c83a5 | 101 | char copyString [dataLength] = {'\0'}; |
maxonK | 0:39e4e38c83a5 | 102 | //スタート、ストップビットをトリムしたデータだけの文字列 |
maxonK | 0:39e4e38c83a5 | 103 | char trimString [dataLength] = {'\0'}; |
maxonK | 0:39e4e38c83a5 | 104 | //文字列→数値変換後の値を格納する変数 |
maxonK | 0:39e4e38c83a5 | 105 | int intVal = 0; |
maxonK | 0:39e4e38c83a5 | 106 | |
maxonK | 0:39e4e38c83a5 | 107 | //バッファへ書き込み |
maxonK | 0:39e4e38c83a5 | 108 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 0:39e4e38c83a5 | 109 | //バッファの内容をうつす |
maxonK | 0:39e4e38c83a5 | 110 | strcpy(copyString,receiveDataString); |
maxonK | 0:39e4e38c83a5 | 111 | //バッファクリア |
maxonK | 0:39e4e38c83a5 | 112 | for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ |
maxonK | 0:39e4e38c83a5 | 113 | receiveDataString[i] = '\0'; |
maxonK | 0:39e4e38c83a5 | 114 | } |
maxonK | 0:39e4e38c83a5 | 115 | //書き込み位置クリア |
maxonK | 0:39e4e38c83a5 | 116 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 117 | |
maxonK | 0:39e4e38c83a5 | 118 | //以下チェックとAtoI |
maxonK | 0:39e4e38c83a5 | 119 | //先頭がスタートビットになってるか |
maxonK | 0:39e4e38c83a5 | 120 | if(!copyString[0] == startbitChar){ |
maxonK | 0:39e4e38c83a5 | 121 | return -5; |
maxonK | 0:39e4e38c83a5 | 122 | } |
maxonK | 0:39e4e38c83a5 | 123 | //末尾がストップビットになっているか |
maxonK | 0:39e4e38c83a5 | 124 | if(!copyString[dataLength-1] == stopbitChar){ |
maxonK | 0:39e4e38c83a5 | 125 | return -6; |
maxonK | 0:39e4e38c83a5 | 126 | } |
maxonK | 0:39e4e38c83a5 | 127 | //データだけをトリミング |
maxonK | 0:39e4e38c83a5 | 128 | //1個目から、後ろから1個目まで |
maxonK | 0:39e4e38c83a5 | 129 | for(int Idx = 1; Idx <= dataLength -2 ; Idx++){ |
maxonK | 0:39e4e38c83a5 | 130 | trimString[Idx-1] = copyString[Idx]; |
maxonK | 0:39e4e38c83a5 | 131 | } |
maxonK | 0:39e4e38c83a5 | 132 | //文字列→数値 |
maxonK | 0:39e4e38c83a5 | 133 | intVal = atoi(trimString); |
maxonK | 0:39e4e38c83a5 | 134 | //数値リターン |
maxonK | 0:39e4e38c83a5 | 135 | return intVal; |
maxonK | 0:39e4e38c83a5 | 136 | |
maxonK | 0:39e4e38c83a5 | 137 | } |
maxonK | 0:39e4e38c83a5 | 138 | |
maxonK | 0:39e4e38c83a5 | 139 | |
maxonK | 0:39e4e38c83a5 | 140 | //以上にひっかからなかった異常時 |
maxonK | 0:39e4e38c83a5 | 141 | //バッファクリア |
maxonK | 0:39e4e38c83a5 | 142 | for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~ |
maxonK | 0:39e4e38c83a5 | 143 | receiveDataString[i] = '\0'; |
maxonK | 0:39e4e38c83a5 | 144 | } |
maxonK | 0:39e4e38c83a5 | 145 | //書き込み位置クリア |
maxonK | 0:39e4e38c83a5 | 146 | stringPosition = 0; |
maxonK | 0:39e4e38c83a5 | 147 | //-3リターン |
maxonK | 0:39e4e38c83a5 | 148 | return -7; |
maxonK | 0:39e4e38c83a5 | 149 | } |