我使用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上显示为大写。
有谁知道可能导致这种情况的原因是什么?我可能会忽略一些简单的事情,但我真的不知道。
答案 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()
时检查值,尽管有时可能难以使用优化代码,并且您可能需要检查寄存器以查找已优化的变量。