こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

マイコン(PIC)とPC間での通信について

プログラムの考え方についての質問です。

環境:
Windows環境にて、Tera Termを用いています。
PICはdsPICです。

行いたいこと:
PICのある値をTera Termを用いてシリアル通信で変化させたい。
その時、5ケタの数値を入れる時に「00001」では無く、「1+[Enter]」で入力をしたい。


質問:
上記を実現する考え方を教えて頂けると幸いです。
(プログラムはもちろん自分で考えます)
または、アルゴリズムの参考書籍や、参考サイト等を教えて頂けると幸いです。
書店で「アルゴリズム」の本を見ても、マイコンや組込みシステムの本が見当たりませんでした。
(私の探し方が悪いとは思うのですが・・)


現状:

1.Tera Term での通信はできています。

3桁の数値を入力し、その値が反映され、PICは動作しています。
しかし、「15」と打つ時も「015」と打っており、スマートではありません。
以下のソースの通り、1文字ずつ受信した文字を、数値に変換し、
各桁に変換しています。

/*ソース抜粋*/
putsUART1(Set_para_Adj_num);
while(BusyUART1());
for(i=0;i<3;i++){
while(!U1STAbits.URXDA); // データ受信すると、「1」になるので次の行へ行く
adj[i] = ReadUART1();
}
for(i=0;i<3;i++){
U1_Send(adj[i]);
while(BusyUART1());
}
CRLF();

adj[0]=(adj[0]-'0')*100; // -'0'でASCII⇒数値への変換
adj[1]=(adj[1]-'0')*10;
adj[2]=adj[2]-'0';
Adj_num=adj[0]+adj[1]+adj[2];

2.Tera TermでのEnterキーの受信は出来ています。
0X0D (CR)を受信すると、「ENETR」が表示されることは確認できています。

下名の考え:
if文で「Enterが押された時」に、今までの入力された桁数を覚えておいて、上位の桁に「0」
を代入するしかないのでしょうか。

投稿日時 - 2015-09-30 16:30:18

QNo.9056408

すぐに回答ほしいです

質問者が選んだベストアンサー

以下のように変更しましょう。

Adj_num = 0;
putsUART1(Set_para_Adj_num);
while(BusyUART1());
for(;;){
while(!U1STAbits.URXDA); // データ受信すると、「1」になるので次の行へ行く
adj[0] = ReadUART1();
U1_Send(adj[0]); //受け取った文字をそのままエコーバックする
while(BusyUART1());
if (adj[0] == 0x0d) {
U1_Send(0x0a); //CRをエコーバックした後はLFもエコーバックする
while(BusyUART1());
break; //Enterを受け取ったのでループを抜ける
} else if ((adj[0] >= '0') && (adj[0] <= '9')) {
Adj_num *= 10;
Adj_num += (adj[0] - '0');
}
}
//Enterを受信してループを抜けた段階で、Ajd_numの中に、希望する答えが入っているので、これ以上、何もする必要はない。

投稿日時 - 2015-09-30 16:51:55

補足

申し訳ございません。

おかしなことを言っていました。
Adj_num *= 100;
は不要ですね。

三桁以上の場合も、chie65535様のプログラムで大丈夫ですね。

例)'1', '5', '3'と入力が来た場合
*10なので、1桁ずつシフトしていきますね。

お恥ずかしい限りです。

投稿日時 - 2015-09-30 22:34:58

お礼

chie65535様:

ソースコードも示して頂き、ありがとうございます。
また、私の抜粋した説明不足のプログラムに、コメントまでつけて頂きありがとうございます。

惚れ惚れする洗練された、プログラムですね。
私のベタ書きが恥ずかしい限りです。
少しでもchie65535様の様なソースを書けるように様々なプログラムを読んでいきます。
本日は、PICの前にいないので、明日に試してみます。
一応頭の中で検算(chie65535様を疑っている訳でなく、コピペで終わらせない為に)
したところ、
例)一回目が'5' 、二回目が'3'と打つと、53になりました。(あくまでも私の頭の中だけですが・・)

また、非常に厚かましい質問ですが、
もし3桁欲しい場合はどうお考えになられますか?
単純に
Adj_num *= 10;の前に
Adj_num *= 100;
を加えても、十の位の入力の時に値が更新されてしまいました。(あくまでも私の頭の中で)

もしお時間があれば、アドバイスを頂けると幸いです。

投稿日時 - 2015-09-30 22:03:01

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-