- ベストアンサー
C言語を用いたマイコンと計測機器の通信方法
- C言語でマイコンと計測機器の通信方法を解説します。
- マイコンと測定機器間のUART通信についてのプログラム作成方法を説明します。
- 一般的なマイコンを使用した外部機器との通信について、コードの記述方法を解説します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.1,2です。 以下のサイトを参考にされましたでしょうか。 http://mbed.org/users/okini3939/notebook/Serial_jp/ このサイトの「割り込みにより、PCシリアルとp9,p10間で送受信する」というサンプルが参考になるかと思いますが、 マイコンからデータを送信する前に受信の割り込みを許可していますので、同じように修正されてみては如何でしょうか。 また、質問者さんのソースを見ると、変数g[]とdcの初期化、オーバーフローチェック等がされていないようなので、その辺りも見直してみては如何でしょうか。
その他の回答 (4)
- maccha_neko
- ベストアンサー率33% (465/1379)
>printf('0x02'); >printf('0x2c'); >printf('0x44');........ これじゃ無理でしょう。printfの第一引数は書式指定用の文字列でしょ? あえてprintfを使うなら printf("%c",0x02); なんていう具合でしょうか。
お礼
ご回答ありがとうございます. printfの書式によって,実際にどのような信号が送られているかを理解したところ問題なく通信できました. ありがとうございました.
- SherlockHolmes2
- ベストアンサー率40% (175/429)
No.2です。 たびたび・・。 ソースコードありがとうございます。 追加で申し訳ありませんが、2点ほど確認させてください。 1.sokuteiki と pc の定義部分(構造体でしょうか)も見せてもらっていいですか。(「#include "mbed.h"」は、されていますよね?) 2.以下のサイトにマイコンの仕様が図解されていますが、これの何番のピンに接続していますか? http://mbed.org/handbook/mbed-NXP-LPC1768 以上です。
お礼
ご回答ありがとうございます。 1.Serial PC(USBTX,USBRX); Serial sokuteiki(p9,p10); 上記のように定義していますが具体的な中身はわかりません......mbed.hもincludeしています。 2. p9にTXをp10にRXを接続しています。 以上,ご確認よろしくお願いいたします。
- SherlockHolmes2
- ベストアンサー率40% (175/429)
No.1です。 追加で確認ですが、マイコンと測定機器は、どのように接続されていますか? もしかして、マイコンUSBポート <-> 測定機器(232C)と接続されていませんか? それだけでは、マイコン側に電源供給出来ないので、プログラムの実行そのものが出来ませんよ。
お礼
ご回答ありがとうございます。 ボーレートなどの通信設定は間違っていません(PCなどとは通信できているので,設定方法は理解出来ているはずです。) また,接続方法ですが.測定器はRS485で,途中でRS232に変換して,MbedのRXD,TXDのピンに接続しています。 説明不足でした。すいません..... PCと測定機器間で確認したところ, 測定値の送信要求 (STX 『DISP』 CR LF EOT ) を送り,正常に通信できていれば, 送信要求 + 測定値が返ってくるようです。 また,送信に異常があれば,送信したデータがそのまま返ってくるようです。(わざとプロトコルの規格外のデータを送信して確認) 昨夜テストしていたのですが,Mbedから送信したデータがそのまま返ってくるところまでは確認できました。 以下がそのコードになりPCのターミナルで受信したデータは『244495350da4』(STX 『DISP』 CR LF EOT )となりました。 接続・設定は問題なさそうなのですが,いかんせんプログラムの知識が浅いため,通信のコードがあっているのかも 分からない状態です。 以下に,私が書いたコードを記載いたしますので,なにとぞアドバイスを宜しくお願い致します。 int i; int dc; char proc[10];//プロトコルを入れる配列 cahr g[20];//測定機器から受信したデータを入れる配列 int main(){ sokuteiki.baud(19200);//ボーレートを19200 sokuteiki.format(8, Serial::None, 1);//ビット長8:パリティなし,STOP BIT 1 i = 0; proc[0] = 0x2;//STX proc[4] = 0x44;//D proc[5] = 0x49;//I proc[6] = 0x53;//S proc[7] = 0x50;//P proc[8] = 0xd;//CR proc[9] = 0xa;//LF proc[10] = 0x4;//EOT for(i = 0;i < 11 ;i++){ sokuteiki.putc(proc[i]);//測定機器にデータ送信 } sokuteiki.attach(dev_rx,Serial::RxIrq);//受信割り込みの許可 while(1){ } } //受信割り込み void dev_rx(){ __disable_irq();//受信割り込み禁止 g[dc] = sokuteiki.getc();//測定機器からデータ受信 pc.printf("%x",g[dc]]);//確認用PCに測定機器から受信したデータを送信 dc++; __enable_irq();//割り込み許可 }
補足
すいません。データ送信部に記載ミスがありました。 proc[0] = 0x2;//STX proc[1] = 0x44;//D proc[2] = 0x49;//I proc[3] = 0x53;//S proc[4] = 0x50;//P proc[5] = 0xd;//CR proc[6] = 0xa;//LF proc[7] = 0x4;//EOT for(i = 0;i < 8 ;i++){ sokuteiki.putc(proc[i]);//測定機器にデータ送信 }
- SherlockHolmes2
- ベストアンサー率40% (175/429)
そのmbedと測定機器のボーレート等の設定は合っていますか?
お礼
ANo2に記載させていただきました。
お礼
ご返事が遅くなってしまい申し訳ありません. プログラムの方に自信がなかったのでプログラムに関してばかり質問していましたが,RS232Cの電圧レベルをTTLに変換することを忘れているだけでした. ご丁寧に何度もありがとうございました.