本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

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

締切済み
※ ChatGPTを利用し、要約された質問です(原文:usartによるpic18fからpic16fへの…)

usartによるpic18fからpic16fへのデータの受け渡しについて

2023/10/18 00:19

このQ&Aのポイント
  • pic18f2680からpic16f690へデータを渡すためにusartを使用して行おうとしていますがうまくいきません。
  • 送信側で指定したデータが受信側で正しく表示されない問題が発生しています。
  • printfなどの書式を変えても問題が解決せず、原因が分からない状況です。
※ 以下は、質問の原文です

usartによるpic18fからpic16fへの…

2010/11/09 19:24

usartによるpic18fからpic16fへのデータの受け渡しについて

いつもお世話になります。
pic18f2680からpic16f690へデータを渡すためにusartを使用して行おうとしていますがうまくいきません。

送り側(18f2680)で
i=3
itoa(i,f);//int f,char i
putsUSART(f);
上記のように送信し,

受け側(16f690)で
    c= getc();//int c
printf("%u",c);
と、受けたところ000000000000000000000000510と表示されてしまいます。
printfなどの書式を変えても問題が治りません。
どなたかお詳しい方がいらっしゃいましたらご教授よろしくお願い致します。

回答 (2件中 1~2件目)

2010/11/09 21:15
回答No.2

http://ftc.suki.net/tpb/saruc07.html#4-6
返ってくる
あたいは
ポインターなので

510番地 に 文字列"3"が返ってきてるはずです

ついでに
itoa(i,f);//int f,char i

となってますが

char *itoa(int,char *,int); ' それぞれを第一引数・第二引数・第三引数という。

int型の数値を文字列へ変換する。

引数?は変換するint型の数値。

引数?は変換した文字列を格納するメモリ上の先頭アドレス(変換したものを代入する対象)。

引数?は何進数で変換するかを指定する(2なら2進・8なら8進・10なら10進数で変換する)。

戻り値は?のアドレス。

となっているので 受け渡しが逆では?
方言の可能性もあるのでマニュアル参照

まあ、書きながらなんとかわかってきた
そもそも、プログラム的におかしいんだ


まあ、ここんとこ "C" なんか 使ってないので
忘れがちですが

itoa は 数値を 文字列に変換する ものです

例えば 数値 100 を 入れると
文字列には "1"+"0"+"0"+"終末文字" が代入されます

18f2680 上のあるメモリ上のアドレス ← ポインタ



送信しているのは そのポインター を送っています

16f690 に送られてくるのは 18f2680に "1"+"0"+"0"+"終末文字" と書かれている アドレス



16f690 には そもそも そのアドレスには なにも書きこまれていないので
無意味な数値 000000000000000000000000510 が 返ってきてます



まあ、ほかにも 突っ込みどころ満載なんだが

プログラム的に
文字列送っているのに 受取側は数値で受け取ってるし




まあ、itorで文字列に変換せず そのまま数値で送ったほうがいいと思いますよ

お礼

2010/11/10 13:43

ご回答ありがとうございます。
>>返ってくるあたいはポインターなので
とありますが、変数が入っているメモリのアドレスが返ってくるということなのでしょうか?
ポインタについてあまりよく理解できていないのですが、PIC間通信をする場合にはどのようにプログラムを書けばよいのでしょうか?(microchipのC18コンパイラを使用しています。)

また、itoaですが、putsUSARTで変数を送ろうとした場合に数値の変数をそのまま送ろうとした場合に送れなかったため、itoaで一度変換してから送信しました。数値をそのまま送るようなことは無理なのでしょうか?

質問者

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

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する
2010/11/09 19:34
回答No.1

毎度JOです。
問題を切り分けて見ましょう、投稿内容では判断出来かねます

先ず送信出来ているかの確認からです、
USARTですからインターフェースIC等を挿入しRS232Cに変換すれば、
パソコン等で送信内容が確認出来ます
この様な検証手段を用意して始める事が必要ですね

USART通信でインターフェースICを使用せずに基板内通信でしょうか?
16f690のデーターシートは熟読されましたか? 
Config等以外な落とし穴を読み飛ばしている可能性もあります

ハードウエア上では
18f2680  16f690
RC6 ― RC7
RC7 ― RC6
GND ― GND

投稿内容に情報が少ないですね、出来る範囲で開示した方が問題解決の近道です

お礼

2010/11/09 19:49

ご回答ありがとうございます。
パソコンに送信して確認はしています。
18f2680→PCでは問題なく送信できています。
18f2680→16f690→PCのときに、数値がおかしくなってしまいます。
よろしくお願い致します。

pic同士は直接配線しています。
18f2680のC6(TXピン)を16f690のB5(RXピン)に接続後、
16f690のB7(TXピン)とデバック用のPCはRS232の変換ICを経由して接続してデータを送っています。
gndは共通です。

18fからPCまたは16fからPCでは問題なく送信できます。
ためしに16fから16fでも行ってみましたが、こちらはうまくいきませんでした。
(数値で2とおくると50と表示されました。)

質問者

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。