我想要实现的目标:我想为某些baud rate
设置自定义tty*
值,例如UART
- 映射终端。
如何:到目前为止我找到的唯一方法是使用位于struct termios2
标题中的<asm/termios>
结构(如上所述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>
),编译器会尖叫关于函数和结构重新声明,他是对的。
如何在不使用某些模糊实践的情况下解决这个问题(比如在命名空间中包装一个标头,如提到的here)?
答案 0 :(得分:1)
如何在不使用某些模糊实践的情况下解决这个问题(比如在命名空间中包装一个标头,如提到的here)?
如果您发现名称空间模糊不清,我不知道您如何称呼它:
#define termios asmtermios
#include <asm/termios.h>
#undef termios
#include <termios.h>
无论如何,这也让你摆脱了error: redefinition of 'struct termios'
。
答案 1 :(得分:1)
我遇到了一个类似的问题-想要使用cargo run
,termios2
和TCGETS2
等定义的自定义波特率支持,同时仍然使用传统的termios调用。我本能地将termios2内容包装在自己的compilation unit中,没有任何问题。所以我的结构看起来像这样:
serial_driver.c / .h
BOTHER
serial_driver_abr.c / .h
#include <termios.h>
#include <fcntl.h>
#include <dirent.h>
int open_port(int fd, int baudrate, eParitySetting parity, int numStopBits)
{
if(baudrate_is_non_standard(baudrate)
setNonStandardBaudRateTermios(fd, baudrate, parity, numStopBits);
else
//all the normal tcgetattr/cfsetospeed/tcsetattr
}
int do_other_things(void)
{
//all the normal tcsendbreak/tcflush/etc things
}
对我来说很好。