suu pen / Mbed 2 deprecated serial_dummy

Dependencies:   mbed BufferedSerial

Committer:
suupen
Date:
Sat Aug 02 10:05:35 2014 +0000
Revision:
2:52002844d0c6
Parent:
1:c6e8a41200d9
Child:
3:327bb0fcdf45
file ????????scanf??gets ?????; ??????????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:7c6ad253848a 1 /**
suupen 0:7c6ad253848a 2 serial data 送信ツール
suupen 2:52002844d0c6 3
suupen 0:7c6ad253848a 4 V00.01 : 140719
suupen 2:52002844d0c6 5
suupen 2:52002844d0c6 6
suupen 0:7c6ad253848a 7 <使い方>
suupen 0:7c6ad253848a 8 "data.txt" に送信する文字列を設定し、mbedに保管する。
suupen 0:7c6ad253848a 9 mbedに通電するかRESET SW を押すとUSB-serialから文字列を出力する
suupen 0:7c6ad253848a 10
suupen 0:7c6ad253848a 11 <data.txtの設定方法>
suupen 0:7c6ad253848a 12 1.コマンド
suupen 0:7c6ad253848a 13 USB-serialのbaudrate
suupen 0:7c6ad253848a 14 9600[bps]を設定する場合
suupen 0:7c6ad253848a 15 >B9600
suupen 0:7c6ad253848a 16 >b9600
suupen 0:7c6ad253848a 17
suupen 0:7c6ad253848a 18 文字列間の送信間隔
suupen 0:7c6ad253848a 19 1000[ms]を設定する場合
suupen 0:7c6ad253848a 20 >T1000
suupen 0:7c6ad253848a 21 2.送信文字列
suupen 0:7c6ad253848a 22 asciiコードで文字を記述していく
suupen 0:7c6ad253848a 23 送信は一行毎となる
suupen 0:7c6ad253848a 24
suupen 0:7c6ad253848a 25 3.data.txt設定例
suupen 0:7c6ad253848a 26 次の行から-----------------
suupen 0:7c6ad253848a 27 >B9600
suupen 0:7c6ad253848a 28 >T100
suupen 0:7c6ad253848a 29 123456789
suupen 0:7c6ad253848a 30 >T200
suupen 0:7c6ad253848a 31 abcdefghi
suupen 0:7c6ad253848a 32 >T300
suupen 0:7c6ad253848a 33 ABCDEFGHI
suupen 0:7c6ad253848a 34
suupen 0:7c6ad253848a 35 >B9600
suupen 0:7c6ad253848a 36 >T1000
suupen 0:7c6ad253848a 37 123
suupen 0:7c6ad253848a 38 abc
suupen 0:7c6ad253848a 39 ABC
suupen 0:7c6ad253848a 40 ひとつ前の行まで-------------
suupen 0:7c6ad253848a 41
suupen 0:7c6ad253848a 42 <USB-Serialの通信設定値>
suupen 0:7c6ad253848a 43 baudrate : data.txtで設定可能(初期値=9600[bps]
suupen 0:7c6ad253848a 44 bits : 8bit
suupen 0:7c6ad253848a 45 parity : none
suupen 0:7c6ad253848a 46 stopbit : 1bit
suupen 0:7c6ad253848a 47
suupen 0:7c6ad253848a 48
suupen 0:7c6ad253848a 49 */
suupen 2:52002844d0c6 50
suupen 2:52002844d0c6 51 //#define DEBUG
suupen 2:52002844d0c6 52
suupen 0:7c6ad253848a 53 #include "mbed.h"
suupen 2:52002844d0c6 54 #include <stdio.h>
suupen 0:7c6ad253848a 55 #include "ctype.h"
suupen 2:52002844d0c6 56 //#include <string.h>
suupen 2:52002844d0c6 57 #include "BufferedSerial.h"
suupen 0:7c6ad253848a 58
suupen 0:7c6ad253848a 59 LocalFileSystem local("local"); // local file systemの設定
suupen 2:52002844d0c6 60 //Serial pc(USBTX, USBRX); // usb-serialの設定
suupen 2:52002844d0c6 61 #ifdef DEBUG
suupen 2:52002844d0c6 62 Serial chk(USBTX, USBRX);
suupen 2:52002844d0c6 63 #endif // DEBUG
suupen 0:7c6ad253848a 64
suupen 2:52002844d0c6 65 BufferedSerial pc(USBTX, USBRX);
suupen 2:52002844d0c6 66 //BufferedSerial pc(p9, p10);
suupen 1:c6e8a41200d9 67 Timeout txSend; // 送信間隔作成用
suupen 0:7c6ad253848a 68
suupen 0:7c6ad253848a 69 DigitalOut ledopen(LED1); // 1:file open 0:file close
suupen 1:c6e8a41200d9 70 DigitalOut ledout(LED2); // 1: serial out
suupen 0:7c6ad253848a 71 //DigitalOut lederror(LED4);
suupen 0:7c6ad253848a 72
suupen 2:52002844d0c6 73 #define Z_bufferNumber (500)
suupen 2:52002844d0c6 74 char buffer[Z_bufferNumber]; // 読みだしたデータの保管先
suupen 2:52002844d0c6 75
suupen 2:52002844d0c6 76 int D_start_wait_us = 100; // 送信開始時の待ち時間 (1/1 [us]/bit) min = 100[us]
suupen 2:52002844d0c6 77 int D_char_wait_us = 100; // キャラクタ間の送信間隔 ( 1/1 [ms]/bit) min = 100[us]
suupen 0:7c6ad253848a 78
suupen 1:c6e8a41200d9 79 // 送信処理状態遷移
suupen 1:c6e8a41200d9 80 typedef enum {
suupen 1:c6e8a41200d9 81 Z_txIdle,
suupen 1:c6e8a41200d9 82 Z_txStart,
suupen 1:c6e8a41200d9 83 Z_txSend
suupen 1:c6e8a41200d9 84 } txSend_t;
suupen 1:c6e8a41200d9 85 txSend_t M_txSend = Z_txIdle; // 0:受信完了(STX送信待ち) 1:STX以降CRまでの送信中
suupen 1:c6e8a41200d9 86
suupen 1:c6e8a41200d9 87
suupen 1:c6e8a41200d9 88 /**
suupen 1:c6e8a41200d9 89 * 割り込み処理
suupen 1:c6e8a41200d9 90 * 送信データ送信処理
suupen 1:c6e8a41200d9 91 * 受信完了から送信開始の20[ms]の遅延
suupen 1:c6e8a41200d9 92 * 送信データ1byte毎に2[ms]の遅延
suupen 1:c6e8a41200d9 93 * を入れて送信する
suupen 1:c6e8a41200d9 94 */
suupen 1:c6e8a41200d9 95 void txDataSend(void)
suupen 1:c6e8a41200d9 96 {
suupen 1:c6e8a41200d9 97 static char *p;
suupen 1:c6e8a41200d9 98
suupen 1:c6e8a41200d9 99 switch(M_txSend) {
suupen 1:c6e8a41200d9 100
suupen 1:c6e8a41200d9 101 case Z_txStart:
suupen 1:c6e8a41200d9 102 // STX ~ CR 送信
suupen 1:c6e8a41200d9 103 p = buffer;
suupen 1:c6e8a41200d9 104 M_txSend = Z_txSend;
suupen 1:c6e8a41200d9 105 //brak;
suupen 1:c6e8a41200d9 106 case Z_txSend:
suupen 1:c6e8a41200d9 107 if(*p != 0x00) {
suupen 1:c6e8a41200d9 108 pc.putc(*p++);
suupen 2:52002844d0c6 109 txSend.attach_us(&txDataSend, D_char_wait_us); // 次回送信開始まで2[us]セット(時間は可変設定にする)
suupen 1:c6e8a41200d9 110 }
suupen 1:c6e8a41200d9 111
suupen 1:c6e8a41200d9 112 else {
suupen 1:c6e8a41200d9 113 // 送信完了
suupen 1:c6e8a41200d9 114 M_txSend = Z_txIdle;
suupen 1:c6e8a41200d9 115 txSend.detach();
suupen 1:c6e8a41200d9 116 }
suupen 1:c6e8a41200d9 117 break;
suupen 2:52002844d0c6 118 case Z_txIdle: // defaultと同じ処理
suupen 1:c6e8a41200d9 119 default:
suupen 1:c6e8a41200d9 120 // nothing
suupen 1:c6e8a41200d9 121 break;
suupen 1:c6e8a41200d9 122 }
suupen 1:c6e8a41200d9 123
suupen 1:c6e8a41200d9 124 }
suupen 1:c6e8a41200d9 125
suupen 1:c6e8a41200d9 126 /**
suupen 1:c6e8a41200d9 127 * main処理
suupen 1:c6e8a41200d9 128 * 受信終了から送信開始までの20[ms]遅延設定
suupen 1:c6e8a41200d9 129 *
suupen 1:c6e8a41200d9 130 */
suupen 2:52002844d0c6 131 void txDataWait(void)
suupen 1:c6e8a41200d9 132 {
suupen 2:52002844d0c6 133 txSend.attach_us(&txDataSend, D_start_wait_us); // 受信完了からx[ms]経過待ち
suupen 1:c6e8a41200d9 134 M_txSend = Z_txStart;
suupen 2:52002844d0c6 135
suupen 1:c6e8a41200d9 136 }
suupen 1:c6e8a41200d9 137
suupen 1:c6e8a41200d9 138 /**
suupen 1:c6e8a41200d9 139 * 送信終了判定
suupen 1:c6e8a41200d9 140 * @@para int 戻り値 送信処理状況 1:送信完了 0:送信中
suupen 1:c6e8a41200d9 141 */
suupen 1:c6e8a41200d9 142 int txSendEndCheck(void)
suupen 1:c6e8a41200d9 143 {
suupen 1:c6e8a41200d9 144 int ans;
suupen 1:c6e8a41200d9 145 if(M_txSend == Z_txIdle) {
suupen 1:c6e8a41200d9 146 ans = 1;
suupen 1:c6e8a41200d9 147 } else {
suupen 1:c6e8a41200d9 148 ans = 0;
suupen 1:c6e8a41200d9 149 }
suupen 1:c6e8a41200d9 150
suupen 1:c6e8a41200d9 151 return(ans);
suupen 1:c6e8a41200d9 152 }
suupen 1:c6e8a41200d9 153
suupen 1:c6e8a41200d9 154
suupen 1:c6e8a41200d9 155
suupen 1:c6e8a41200d9 156
suupen 1:c6e8a41200d9 157
suupen 1:c6e8a41200d9 158
suupen 0:7c6ad253848a 159
suupen 0:7c6ad253848a 160 int main()
suupen 0:7c6ad253848a 161 {
suupen 2:52002844d0c6 162 pc.baud(9600);
suupen 0:7c6ad253848a 163 FILE *fp;
suupen 2:52002844d0c6 164 // int ans;
suupen 0:7c6ad253848a 165 char *p;
suupen 0:7c6ad253848a 166 int timer; // serial送信時間間隔 ( 1/1 [ms]/bit)
suupen 0:7c6ad253848a 167 int baud; // usb-serialのbaudrate ( 1/1 [bps]/bit)
suupen 0:7c6ad253848a 168
suupen 0:7c6ad253848a 169 fp = fopen("/local/data.txt", "r");
suupen 0:7c6ad253848a 170 ledopen = 1;
suupen 0:7c6ad253848a 171
suupen 0:7c6ad253848a 172
suupen 0:7c6ad253848a 173 while(1) {
suupen 2:52002844d0c6 174 if(fgets(buffer, Z_bufferNumber, fp) != NULL){
suupen 2:52002844d0c6 175 // ans = fscanf(fp,"%s",buffer);
suupen 2:52002844d0c6 176 // if(ans != -1) {
suupen 0:7c6ad253848a 177 p = buffer;
suupen 0:7c6ad253848a 178 // 文字列 or 制御コマンド
suupen 2:52002844d0c6 179 //ここ
suupen 2:52002844d0c6 180 switch(*p){
suupen 2:52002844d0c6 181 case '>':
suupen 2:52002844d0c6 182 // if(*p == '>') {
suupen 0:7c6ad253848a 183 // コマンドとして処理する
suupen 2:52002844d0c6 184 p++;
suupen 0:7c6ad253848a 185 switch(*p++) {
suupen 0:7c6ad253848a 186 case 'T':
suupen 0:7c6ad253848a 187 case 't':
suupen 2:52002844d0c6 188 switch(*p++) {
suupen 2:52002844d0c6 189 case 'F':
suupen 2:52002844d0c6 190 case 'f':
suupen 2:52002844d0c6 191 // serial data の送信間隔時間を設定
suupen 2:52002844d0c6 192 timer = 0;
suupen 2:52002844d0c6 193 while(isdigit(*p) != 0) {
suupen 2:52002844d0c6 194 timer *= 10;
suupen 2:52002844d0c6 195 timer += (*p++ - '0');
suupen 2:52002844d0c6 196 }
suupen 2:52002844d0c6 197 if(timer == 0) {
suupen 2:52002844d0c6 198 // 設定値が0の時は、最小値1[us]を設定する
suupen 2:52002844d0c6 199 // 100[us]以下にすると割り込みがかからなくなるのでその対策
suupen 2:52002844d0c6 200 D_start_wait_us = 100;
suupen 2:52002844d0c6 201 } else {
suupen 2:52002844d0c6 202 D_start_wait_us = timer * 1000;
suupen 2:52002844d0c6 203 }
suupen 2:52002844d0c6 204 #ifdef DEBUG
suupen 2:52002844d0c6 205 chk.printf("timer = %06d\r\n",timer);
suupen 2:52002844d0c6 206 #endif // DEBUG
suupen 2:52002844d0c6 207 break;
suupen 2:52002844d0c6 208 case 'C':
suupen 2:52002844d0c6 209 case 'c':
suupen 2:52002844d0c6 210 // キャラクタ間隔時間(第二引数)の確認
suupen 2:52002844d0c6 211 timer = 0;
suupen 2:52002844d0c6 212 while(isdigit(*p) != 0) {
suupen 2:52002844d0c6 213 timer *= 10;
suupen 2:52002844d0c6 214 timer += (*p++ - '0');
suupen 2:52002844d0c6 215 }
suupen 2:52002844d0c6 216 if(timer == 0) {
suupen 2:52002844d0c6 217 // 設定値が0の時は、最小値1[us]を設定する
suupen 2:52002844d0c6 218 // 100[us]以下にすると割り込みがかからなくなるのでその対策
suupen 2:52002844d0c6 219 D_char_wait_us = 100;
suupen 2:52002844d0c6 220 } else {
suupen 2:52002844d0c6 221 D_char_wait_us = timer * 1000;
suupen 2:52002844d0c6 222 }
suupen 2:52002844d0c6 223 break;
suupen 2:52002844d0c6 224 default:
suupen 2:52002844d0c6 225 break;
suupen 0:7c6ad253848a 226 }
suupen 0:7c6ad253848a 227 break;
suupen 2:52002844d0c6 228 case 'B':
suupen 2:52002844d0c6 229 case 'b':
suupen 2:52002844d0c6 230 // baudrate 設定
suupen 0:7c6ad253848a 231 baud = 0;
suupen 2:52002844d0c6 232 while(isdigit(*p) != 0) {
suupen 0:7c6ad253848a 233 baud *= 10;
suupen 0:7c6ad253848a 234 baud += (*p++ - '0');
suupen 0:7c6ad253848a 235 }
suupen 0:7c6ad253848a 236 pc.baud(baud);
suupen 2:52002844d0c6 237 #ifdef DEBUG
suupen 2:52002844d0c6 238 chk.printf("baud = %d\r\n",baud);
suupen 2:52002844d0c6 239 #endif //DEBUG
suupen 0:7c6ad253848a 240 break;
suupen 0:7c6ad253848a 241 default:
suupen 0:7c6ad253848a 242 // nothing
suupen 0:7c6ad253848a 243 break;
suupen 0:7c6ad253848a 244 }
suupen 2:52002844d0c6 245 //ここ
suupen 2:52002844d0c6 246 break;
suupen 2:52002844d0c6 247 case ';':
suupen 2:52002844d0c6 248 // comment
suupen 2:52002844d0c6 249 break;
suupen 2:52002844d0c6 250 default:
suupen 2:52002844d0c6 251 // } else {
suupen 0:7c6ad253848a 252 // 出力文字列として処理する
suupen 1:c6e8a41200d9 253
suupen 2:52002844d0c6 254 txDataWait();
suupen 2:52002844d0c6 255 while(txSendEndCheck() == 0) {
suupen 1:c6e8a41200d9 256 // 割り込みで送信中
suupen 1:c6e8a41200d9 257 ledout = !ledout; // この行がないとwhile文から抜けなくなる。原因不明
suupen 2:52002844d0c6 258 }
suupen 2:52002844d0c6 259
suupen 1:c6e8a41200d9 260
suupen 2:52002844d0c6 261 // pc.printf("%s\n",buffer);
suupen 0:7c6ad253848a 262 wait_ms(timer);
suupen 2:52002844d0c6 263 //ここ
suupen 2:52002844d0c6 264 break;
suupen 0:7c6ad253848a 265 }
suupen 0:7c6ad253848a 266 } else {
suupen 0:7c6ad253848a 267 // 読みだすデータがなくなったら、先頭に戻す
suupen 0:7c6ad253848a 268 fclose(fp);
suupen 0:7c6ad253848a 269 ledopen = 0;
suupen 2:52002844d0c6 270 // wait_ms(timer);
suupen 0:7c6ad253848a 271
suupen 0:7c6ad253848a 272 fp = fopen("/local/data.txt", "r");
suupen 0:7c6ad253848a 273 ledopen = 1;
suupen 0:7c6ad253848a 274 }
suupen 0:7c6ad253848a 275 }
suupen 0:7c6ad253848a 276 }
suupen 2:52002844d0c6 277
suupen 2:52002844d0c6 278