g ++优化小写到大写 - bug?

时间:2011-07-12 18:23:18

标签: c++ serial-port

我使用g ++ 4.1.2遇到了一个非常奇怪的问题。我有一个非常基本的程序,它打开一个串口并将数据写入其中。港口开放&使用以下命令进行设置:

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上显示为大写。

有谁知道可能导致这种情况的原因是什么?我可能会忽略一些简单的事情,但我真的不知道。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您必须问自己的问题是serial_out在传递给write()时是否具有正确的值,此后它是在库调用中,以及编译单元的优化级别没有任何影响。

优化和未优化代码之间行为的大多数变化都是由于使用 undefined 实现定义编译器行为,这可能会在不同的编译设置之间发生变化。您可能需要在此处显示与变量serial_out相关的所有代码,而不是端口配置。

理想情况下,使用调试器在调用write()时检查值,尽管有时可能难以使用优化代码,并且您可能需要检查寄存器以查找已优化的变量。