Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed BufferedSerial
main.cpp@2:52002844d0c6, 2014-08-02 (annotated)
- 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?
User | Revision | Line number | New 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 |