電子書籍の厳選無料作品が豊富!

現在,マイコン(Mbed)と測定機器間でUART通信を行い,測定機器の測定値をマイコンに取り込もうと,プログラムを作成しています。

測定器の説明書には
STX 『DISP』 CR LF EOT (DISP以外は制御コード)
の順にマイコンからデータを送れば測定値が返ってくると書いてありますが,C言語ではどのように記述すればよいでしょうか?

ためしに
printf('0x02');
printf('0x2c');
printf('0x44');..................
というように順番に送信してみましたが,測定値を取得できませんでした。

PCのVisual C++/CLIでソフトを作成し,測定器とPC間で通信したところ問題なく測定値を取得できました。

マイコンを使用して,外部機器と通信する場合,一般的にはどのようにコードを記述すればよいでしょうか?

すごく初歩的な質問だと思いますが,なにとぞご教授宜しくお願い致します。

A 回答 (5件)

No.1,2です。



以下のサイトを参考にされましたでしょうか。
http://mbed.org/users/okini3939/notebook/Serial_ …

このサイトの「割り込みにより、PCシリアルとp9,p10間で送受信する」というサンプルが参考になるかと思いますが、
マイコンからデータを送信する前に受信の割り込みを許可していますので、同じように修正されてみては如何でしょうか。

また、質問者さんのソースを見ると、変数g[]とdcの初期化、オーバーフローチェック等がされていないようなので、その辺りも見直してみては如何でしょうか。
    • good
    • 0
この回答へのお礼

ご返事が遅くなってしまい申し訳ありません.
プログラムの方に自信がなかったのでプログラムに関してばかり質問していましたが,RS232Cの電圧レベルをTTLに変換することを忘れているだけでした.
ご丁寧に何度もありがとうございました.

お礼日時:2012/12/26 13:15

>printf('0x02');


>printf('0x2c');
>printf('0x44');........
これじゃ無理でしょう。printfの第一引数は書式指定用の文字列でしょ?
あえてprintfを使うなら
printf("%c",0x02);
なんていう具合でしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます.
printfの書式によって,実際にどのような信号が送られているかを理解したところ問題なく通信できました.
ありがとうございました.

お礼日時:2012/12/26 13:17

No.2です。


たびたび・・。

ソースコードありがとうございます。
追加で申し訳ありませんが、2点ほど確認させてください。

1.sokuteiki と pc の定義部分(構造体でしょうか)も見せてもらっていいですか。(「#include "mbed.h"」は、されていますよね?)
2.以下のサイトにマイコンの仕様が図解されていますが、これの何番のピンに接続していますか?
http://mbed.org/handbook/mbed-NXP-LPC1768

以上です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

1.Serial PC(USBTX,USBRX);
Serial sokuteiki(p9,p10);

上記のように定義していますが具体的な中身はわかりません......mbed.hもincludeしています。

2. p9にTXをp10にRXを接続しています。

以上,ご確認よろしくお願いいたします。

お礼日時:2012/11/02 13:25

No.1です。


追加で確認ですが、マイコンと測定機器は、どのように接続されていますか?
もしかして、マイコンUSBポート <-> 測定機器(232C)と接続されていませんか?
それだけでは、マイコン側に電源供給出来ないので、プログラムの実行そのものが出来ませんよ。

この回答への補足

すいません。データ送信部に記載ミスがありました。

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]);//測定機器にデータ送信

}

補足日時:2012/11/02 09:44
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ボーレートなどの通信設定は間違っていません(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();//割り込み許可
}

お礼日時:2012/11/02 08:43

そのmbedと測定機器のボーレート等の設定は合っていますか?

    • good
    • 0
この回答へのお礼

ANo2に記載させていただきました。

お礼日時:2012/11/02 08:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!