【发布时间】:2013-07-01 17:54:16
【问题描述】:
我有一个使用 buildroot 生成的嵌入式 linux 设置。作为我的应用程序的一部分,我有一个专用线程打开串行端口 (/dev/ttyS0) 用于侦听和回复 modbus 消息。它工作正常,但是当我的目标设备连接到我的主机开发机器时,每当我关闭我的开发机器时,都会通过串行端口发送一些东西,这会杀死我在目标上的进程。在这种情况下,我相信收到 SAK(安全注意密钥)会导致 SAK 内核消息和进程被杀死。我在 unix/linux stackexchange 上发布了this question,它的答案部分地帮助了我。问题是当我使用禁用串行端口 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 设置吗?
【问题讨论】:
-
我给您的第一个建议是始终将您的新 termios 标志建立在旧标志的基础上(即,始终将您正在更改的内容与或在新标志中)。这意味着您的代码未知的任何标志都不会受到您的更改的影响。
-
@Hasturkun 是的,这是个好建议,我通常会这样做。在这种情况下,我只想简明扼要地说明我设置了哪些标志。我总是存储原始设置并在程序关闭时重置它们。
标签: c linux serial-port termios