うごかないよ

Dependencies:   mbed

Committer:
maxonK
Date:
Tue Mar 31 10:54:16 2015 +0000
Revision:
0:39e4e38c83a5
Child:
1:a2d4425c540b
?????

Who changed what in which revision?

UserRevisionLine numberNew 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 }