2011-07-12 95 views
1

我遇到了一个很奇怪的问题,使用g ++ 4.1.2。我有一个非常基本的程序,它打开一个串口并向它写入数据。该端口被打开使用下列命令&设置:g ++优化小写字母大写 - bug?

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); 

我具有由char ASCII常量的阵列,以通过串行链路被发送。数据使用简单的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()时的值,但有时可能难以遵循优化的代码,并且您可能需要检查寄存器以找出已优化的变量。