2

我有一个使用 buildroot 生成的嵌入式 linux 设置。作为我的应用程序的一部分,我有一个专用线程打开串行端口 (/dev/ttyS0) 用于侦听和回复 modbus 消息。它工作正常,但是当我的目标设备连接到我的主机开发机器时,每当我关闭我的开发机器时,都会通过串行端口发送一些东西,这会杀死我在目标上的进程。在这种情况下,我相信收到 SAK(安全注意密钥)会导致 SAK 内核消息和进程被杀死。我在 unix/linux stackexchange 上发布了这个问题,它的答案部分帮助了我。问题是当我使用禁用串行端口 SAK 时

 setserial /dev/ttyS0 ^sak

在系统启动时,当我稍后使用用户空间 API C 代码打开端口时,串行端口再次使用 SAK 选项打开(我已通过禁用 SAK、启动我的应用程序、再次检查setserial以再次找到 SAK 集来验证这一点)。基本上,我需要知道在配置串行端口时需要在termios结构中设置哪些标志。tcsetattr()目前我打开序列号的代码如下:

int current_fd = open(strfile.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
termios new_settings;
tcgetattr(current_fd, &old_options);
tcgetattr(current_fd, &new_settings);

new_settings.c_cflag = 0;
new_settings.c_cflag |= (CLOCAL | CREAD | CS8);
new_settings.c_lflag = 0;
new_settings.c_oflag = 0;
new_settings.c_oflag |= (ONOCR | ONLRET);  
new_settings.c_iflag = 0;
new_settings.c_iflag |= (IGNBRK | IGNPAR | IGNCR);    
tcsetattr(current_fd, TCSANOW, &new_settings);

我已阅读所有termios手册页,但看不到任何与 SAK 相关的内容 - 唯一相关的是IGNBRK我设置的设置。我可以通过用户空间 API 禁用串行端口上的 SAK 设置吗?

4

1 回答 1

2

我实际上已经能够使用以下结构和标志来做到serial_structASYNC_SAK一点ioctl()

serial_struct s_serial;
memset(&s_serial,0,sizeof(s_serial));
ioctl(current_fd, TIOCGSERIAL, &s_serial);
s_serial.flags &= ~ASYNC_SAK;  
ioctl(current_fd, TIOCSSERIAL, &s_serial);

我仍然不知道为什么打开串行端口会覆盖sak我之前设置的标志,setserial()但是在我设置termios选项之前添加上面的代码已经解决了问题并且sak标志仍然被禁用。

于 2013-07-01T09:54:16.190 回答