2011-07-12 14 views
1

g ++ 4.1.2で非常に奇妙な問題が発生しました。私はシリアルポートを開いてそれにデータを書き込む非常に基本的なプログラムを持っています。ポートは、次のコマンドを使用して&セットアップを開いている:g ++小文字から大文字に最適化する - バグ?

fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); 

struct termios port_settings; 

cfsetispeed(&port_settings, B115200); 
cfsetospeed(&port_settings, B115200); 

port_settings.c_cflag &= ~PARENB; 
port_settings.c_cflag &= ~CSTOPB; 
port_settings.c_cflag &= ~CSIZE; 
port_settings.c_cflag |= CS8; 

tcsetattr(fd, TCSANOW, &port_settings); 

私は、シリアルリンクを介して送信されるASCII定数からなるcharの配列を持っています。データは、書かれるべき文字であるwrite(fd, &serial_out, 1)serial_outを直接使用して書き込まれる。このデータは16x2 LCDに表示されます。

ここでは奇妙なことがあります。私が-O0とコンパイルする限り、これはすべて素晴らしいです。しかし、それ以上のコンパイル(1、2、3、またはs)の場合、すべての小文字はLCDに大文字で表示されます。

これを引き起こした原因は何ですか?私は単純なものを見落としているかもしれないが、私は本当に手がかりがない。

答えて

3

これは基本的に、ターミナルパラメータをランダムな値に設定しているためです。

、より意味のある行動を得る最初のシリアルポートの設定を問い合わせた後、あなたが合うように項目を変更するには:

struct termios port_settings; 
if (tcgetattr (fd, &port_settings) != 0) 
      return -1; 

cfsetispeed(&port_settings, B115200); 
cfsetospeed(&port_settings, B115200); 

port_settings.c_cflag &= ~(PARENB|CSTOPB|CSIZE); 
port_settings.c_cflag |= CS8; 

tcsetattr(fd, TCSANOW, &port_settings); 
+0

意味をなさないように思われること。明日テストします! – Darhuuk

+0

あなたは 'CS8'をクリアしていますが、彼のコードがそのビットを設定していました。 – Tim

+0

@Tim:鋭い目に感謝します。私はそれを修正しました。 – wallyk

1

serial_outは、write()に渡された時点で正しい値を持っているかどうかです。それ以降は、ライブラリ呼び出し中であり、コンパイル単位の最適化レベルは影響を受けません。最適化と最適化されていないコードの間の行動の

ほとんど変化は未定義実装が異なるコンパイル設定の間で変更される可能性がありコンパイラの動作を、定義された使用に起因するものです。ポート設定ではなく、変数serial_outに関するすべてのコードとしてここに表示する必要があるでしょう。

write()が呼び出されたときにデバッガを使用するのが理想的ですが、最適化されたコードでは実行するのが難しい場合がありますが、最適化された変数のレジスタを調べる必要があります。

関連する問題