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

 setserial /dev/ttyS0 ^sak

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

最佳答案

我实际上已经能够使用serial_struct结构和ASYNC_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标志保持禁用的情况,我仍然感到困惑。

关于c - 如何使用用户空间API在Linux上禁用串行端口SAK选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17400822/

10-13 04:57