我想实现的目标:我想为一些类似tty*
的UART
Map终端设置定制的baud rate
值。
方法:到目前为止,我发现的唯一方法是使用位于in1d4d1e头中的struct termios2
结构(正如前面提到的here,第一个答案)。
到目前为止,我的解决方案运行得很好,但现在我需要使用一些函数:
speed_t cfgetispeed(const struct termios *);
int tcdrain(int);
int tcflow(int, int);
int tcflush(int, int);
int tcgetattr(int, struct termios *);
pid_t tcgetsid(int);
int tcsendbreak(int, int);
int tcsetattr(int, int, struct termios *);
问题是,在<asm/termios.h>
中没有这样的函数,我需要包含<termios.h>
才能使用它们。
问题:如果我同时包含两个头文件(<asm/termios.h>
和<termios.h>
),编译器会因为函数和结构重新声明而尖叫,他是对的。
我如何才能在不使用一些晦涩的做法(如将一个头 Package 在名称空间中,如前面提到的here)的情况下解决此问题?
4条答案
按热度按时间0wi1tuuw1#
我如何才能在不使用一些晦涩的做法(如将一个头 Package 在名称空间中,如前面提到的here)的情况下解决此问题?
如果您觉得名称空间晦涩难懂,我不知道您会怎么称呼它:
无论如何,这也能让你摆脱
error: redefinition of 'struct termios'
。g0czyy6m2#
我也遇到了类似的问题--我想要定义为
termios2
、TCGETS2
和BOTHER
的定制波特率支持,同时仍然使用传统的Termios调用。我本能地将Termios2包在它自己的compilation unit中,没有任何问题。所以我的结构看起来是这样的:Serial_driver.c/.h
Serial_Driver_abr.c/.h
对我来说很管用。
e4yzc0pl3#
我用旧的ARM交叉编译器遇到了同样的问题,但找到了最新的,gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf,用不同的头文件解决了这个问题。以下是我的代码:
nafvub8i4#
我不认为这些答案中的任何一个正确地解决了这个问题(它们都相当老套)。Glibc的源代码让您很好地了解了如何非常轻松地实现这些功能:
例如,tcdrain是一个简单的ioctl调用: