Armadilloフォーラム

RS485 データビット長

kazukitakahashi

2018年11月5日 14時34分

Armadillo-IoT G3LのRS485通信を使用して
・ボーレート :9600
・データビット長 :7bit
・ストップビット長 :2bit
・パリティ :even
の対向機と通信を行いたいのですが、linuxからデータビット長を7に設定しても
データビット長が8で、通信されています。

NXP Semiconductors i.MX7Dualのマニュアルでも
「7 or 8 data bits for RS-232 characters, or 9 bit RS-485 format」
という記載があるので、RS485通信ではデータビット長を8以外に変更することはできないのでしょうか?

コメント

y.nakamura

2018年11月5日 16時34分

中村です。

> Armadillo-IoT G3LのRS485通信を使用して
> ・ボーレート :9600
> ・データビット長 :7bit
> ・ストップビット長 :2bit
> ・パリティ :even
> の対向機と通信を行いたいのですが、linuxからデータビット長を7に設定しても
> データビット長が8で、通信されています。

試してみました。
7ビットで出力されているようですけど・・・

# stty -F /dev/ttymxc1 parenb -parodd cs7 cstopb
# echo -n U > /dev/ttymxc1
# echo -n T > /dev/ttymxc1
の出力をオシロでみてみました。

--
なかむら

kazukitakahashi

2018年11月5日 17時03分

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

同様の手順で、出力が変わることをこちらでも確認致しました。

こちらの作成ソフトはC言語を使用しておりまして、添付のような関数を使用しているのですが
C言語でtermios構造体を使用した場合でも、同様の結果となりますでしょうか?

ファイル ファイルの説明
rs485.c サンプルソース

y.nakamura

2018年11月5日 17時45分

中村です。

> こちらの作成ソフトはC言語を使用しておりまして、添付のような関数を使用しているのですが
> C言語でtermios構造体を使用した場合でも、同様の結果となりますでしょうか?

添付のソース、見ました。
試してはいません。

まず、
memset( &tio, 0x00, sizeof(tio) );
はやらずに
tcgetattr(serial_fd, &tio);
で現在の設定を取得し、
cfsetispeed( &tio, baudRate );
cfsetospeed( &tio, baudRate );
cfmakeraw( &tio );
をして、
データ長、ストップビット、パリティなどを設定する前に
tio.c_cflag &= ~(CSIZE|CSTOPB|PARENB|PARODD); // ←★
で関連するビットを落とし、
そのあと、
tio.c_cflag |= CREAD;
tio.c_cflag |= CLOCAL;
tio.c_cflag |= cs;
tio.c_cflag |= stopbit;
tio.c_cflag |= parity;
をやるようにすれば、動いてくれると思います。

cfmakeraw()の中でPARENBは落とされるはずですので、
★のところのPARENBはなくてもいいのですが、
書いておいた方がはっきりしていいと思います。

cfmakeraw()の中で何をやっているかは、
cfmakeraw()のmanページに書いてあります。
cfmakeraw()でCS8を設定してますので、これも注意が必要です。

--
なかむら

y.nakamura

2018年11月5日 17時52分

中村です。

追加です。

最後に
// ポートの設定を有効にする
ioctl( serial_fd, TCSETS, &tio );
をやっていますが、これは不要です。

TCSETSはtcsetattr(fd, TCSANOW, &tio)と同じです。
(とmanページに書いてありました)

--
なかむら

kazukitakahashi

2018年11月5日 18時21分

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

ご指摘の内容で動作が改善されました。
ご対応ありがとうございました。