[Armadillo:06116] Re: Armadillo-440でシリアル通信のボーレートを変更する方法について

Takenoshita Koyo email@hidden
2010年 11月 5日 (金) 19:36:02 JST


竹之下です。

正直に言って、頂いた情報だけでは原因は分かりません。
基本に立ち戻って、一つ一つ確認していきたいと思います。

1. まずはPCで動かしてみる
2. コードは最小限で
3. エラーが発生していないか必ず確認する

1. まずはPCで動かしてみる
Armadilloでプログラムを動かす前に、まずはPC Linux [*1]で確実に動くこと
を確認してください。PC Linuxで動いたら、素のLinuxで動作しているArmadillo
で確認し、それもOKなら最後にAndroidで確認という風に順を追っていくと
良いと思います。

今回は、PC Linuxでも動いていないとのことです。そのような場合は、確実に
動作する既存のツールやコードで確認してみると良いと思います。

シリアルポートの設定は、sttyコマンドで調べることができます。自分で書いた
コードでシリアルポート(/dev/ttyS0[*2])の設定を変更したあと、sttyコマンド
を実行すると意図した通り設定が反映されているでしょうか?

sttyコマンドを以下のように実行すると、シリアルポートの設定を表示してくれます。
[PC ~]$ stty -F /dev/ttyS0
speed 115200 baud; line = 0;
min = 1; time = 5;
ignbrk -brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

2. コードは最小限で
見せていただいたコードは、
> 	write(fd, snd_buf, BUF_LEN);
という記述から、何かのコードの一部なのかな?と思います。
今確認したいことはシリアルポートの設定変更をC言語でどうやるか?という
ことなので、設定変更だけをするコードを書いて、動作確認をしてみてください。

http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-1.0.0/ch06.html#sec_using_serial_port
で紹介しているコードのsetup_serial()で行っている処理と、見せていただいたコードの違いは

- VTIMEとVMINの値
  setup_setial()では以下のように設定しています。
        tio.c_cc[VTIME] = 0; /* キャラクタ間タイマー無効 */
        tio.c_cc[VMIN] = 1; /* 最低1文字送信/受信するまでブロックする */
  見せていただいたコードでは、逆になっていますね。

- ボーレートの設定に使う関数
  setup_serial()では、ボーレートの設定はcfsetspeed()を使って一度に行っています。
  一方で、見せていただいたコードではcfsetospeed()とcfsetispeed()を使って行っています。

  cfsetspeed()はBSD拡張なので、移植性を考えるとあまり使わない方が良いのかもしれませんが、
  まずは、動くことが分かっている書き方で動作確認するのが良いと思います。

3. エラーが発生していないか必ず確認する
見せていただいたコードは抜粋で、本当のコードではエラー処理をしっかりしている
のかもしれませんが、エラーが発生した場合の処理は必ず書いてください。その際、
perrorを使うと、エラー要因を表示してくれます。

エラー発生箇所と要因が分かれば、もう少し原因を追求することができるかもしれません。
エラーが発生していない場合はその旨も書いていただけると、それも見る側にとっては
ヒントになります。

[*1] Ubuntuをお使いのようですので、それで構いません。
[*2] 環境によって変わる可能性があります。USB to Serial変換ケーブルを使用している
     場合は、/dev/ttyUSB0かもしれません。

和佐田 翔一 さんは書きました:
> 竹之下様
> 
> 和佐田です。
> 
>> [*2] http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-1.0.0/ch06.html#sec_using_serial_port
> 上記サイトを参考に下記のようなコードで実行してみました。
> ------------------------------------------------------------------
> 	fd = open("/dev/ttymxc1", O_RDWR | O_NOCTTY); 
> 
> 	tcgetattr(fd, &oldtio);
> 
> 	newtio = oldtio;
> 
> 	memset(&newtio, 0, sizeof(newtio));
> 
> 	newtio.c_iflag = IGNBRK | IGNPAR;
> 
> 	newtio.c_cflag = CS8 | CLOCAL | CREAD;
> 	newtio.c_cc[VTIME] = 1; 
> 	newtio.c_cc[VMIN]  = 0; 
> 	cfsetospeed(&newtio, B19200);
> 	cfsetispeed(&newtio, 0);
> 
> 	tcflush(fd, TCIFLUSH);
> 	tcsetattr(fd,TCSANOW,&newtio);
> 
> 	write(fd, snd_buf, BUF_LEN);
> 
> 	tcsetattr(fd, TCSANOW, &oldtio);
> 
> 	close(fd);
> -------------------------------------------------------------------
> しかし、やはりロガーでは9600bpsでしか正常な電文が確認できない状態と
> なっております。
> どこかおかしなところなどありましたらご教示して頂けないでしょうか。
> 宜しくお願いいたします。
> 
> 
> 
> On 2010年11月04日 16:13, Takenoshita Koyo wrote:
>> 横から失礼します。竹之下です。
>>
>> C言語を使ったシリアル通信のプログラミングについては、
>> 先ごろ公開した「Armadillo 実践開発ガイド[*1]」の第2部に説明があります[*2]。
>>
>> 簡単な書き方から効率的なコードまで紹介していますので、よろしければ参照
>> してみてください。
>>
>> [*1] http://armadillo.atmark-techno.com/armadillo-guide
>> [*2] http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-1.0.0/ch06.html#sec_using_serial_port
>>
>> 和佐田 翔一 さんは書きました:
>>   
>>> PC Linux(Ubuntu 10.04.1 LTS)で実行してみたところ、変更できませんで
>>> した。
>>> そもそも変更方法自体間違っているということなのでしょうか?
>>> 何分、Linux開発の経験が浅いので、参考になるHPなどご存知でしたら
>>> ご教示頂けないでしょうか?
>>> 宜しくお願いいたします。
>>>     
>>   
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 


-- 
Koyo Takenoshita




armadillo メーリングリストの案内