问题标签 [termios]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
28902 浏览

c - 如何在 Linux 上正确设置串行通信

我正在尝试从 FPGA 板读写数据。该板本身带有一个驱动程序,该驱动程序在插入该板时创建一个名为 ttyUSB0 的终端设备。在 FPGA 上,实现了异步接收器和发送器,它们似乎可以工作。

但是,C 方面似乎存在问题。我一直在使用一些测试向量来测试 FPGA 是否输出了正确的信息。我注意到了一些事情:

  1. 设备有时无法正确打开
  2. 有时无法检索或设置终端属性。
  3. 读取有时是非阻塞的,并且不会检索到正确的值。

下面是我如何设置终端和文件描述符选项。大部分内容来自这里:http ://slackware.osuosl.org/slackware-3.3/docs/mini/Serial-Port-Programming

任何关于程序为什么会失败的建议或评论都会非常有帮助。

更新 我已经根据第一个答案修改了我的代码。这就是我现在所拥有的:

澄清一下,接收器和发送器使用 8 个数据位、1 个停止位和无奇偶校验位。

0 投票
1 回答
639 浏览

terminal - 终端提示失真且不可读

我是 linux 编程的新手。我按照网络上的示例读取/写入控制台,例如“/dev/ttyS0”。每次我运行代码时,它都会退出而不提示用户编写输入。它还会扭曲终端提示符(换行符),我无法看到我正在输入的内容......这是我正在使用的代码:

0 投票
1 回答
1047 浏览

c++ - termios Arduino 读/写失败

您好,我在尝试对 Arduino 进行编程以从 c++ 程序中获取命令时遇到了一些麻烦。我正在使用 termios 连接到 Arduino。Arduino 处于网关模式(基本上它本身并不执行代码,而是等待来自我的程序的输入以与我连接到它的硬件进行交互)。

我的 termios 设置是这样的:

我写和读到 Arduino 的代码是这样的:

最初,我向 Arduino 发送了一个测试命令(“AT\r\n”),它以(“OK”)响应,但在此之后任何后续的读/写都失败了。

在测试命令中,Arduino 的 RX 和 TX 引脚会亮起(意味着它正在接收和传输数据),但之后我发送的命令失败。当我尝试写入 Arduino 并且任何读取命令无限期挂起时,Arduino 不会亮起。

我认为问题类似于文件处理程序关闭,但我不确定如何测试它,或者它可能完全是另一个问题。

0 投票
1 回答
1084 浏览

c - C termios and printf issue

I'm using Lubuntu with LXterminal.

I have (somewhat) unashamedly copied the basis for this code from a stack overflow answer that gives details on c non-blocking keyboard input.

This is the first part:

Here is one main function that shows some strange behavior.

What this main loop does is it gets 6 character blocks (ex. ENTER 6 times or arrow key twice.) However, where it says printf there is no printout until the program finishes.

This can be seen better when you add

to the end of the main function.

So what's going on here? Is there some sort of magic that happens at the end of the program that releases all of the printf functions?

How do I make it printf when the program is still running?

0 投票
1 回答
23458 浏览

serial-port - Raspberry Pi UART 程序在 C 中使用 termios 接收垃圾(Rx 和 Tx 直接连接)

我有一个用 C 语言编写的简单程序,它使用 termios 将基本字符串发送到 Raspberry Pi UART 并尝试读取和输出响应。Raspberry Pi 上的 Rx 和 Tx 引脚通过跳线连接,因此发送的任何内容都应立即接收。

尽管程序输出它成功发送和接收所选字符串 ('Hello') 的 5 个字符,但尝试打印缓冲区的内容只会产生一两个垃圾字符。

该程序:

输出:

我自己看不到代码有任何重大问题,但我可能错了。我可以使用连接相同设置的 PuTTY 成功发送和接收字符,所以这不是硬件问题。虽然我没有在 PuTTY 中尝试过,但尝试使用该程序连接低于 115200 波特的任何东西都不会收到任何内容。

我哪里错了?

0 投票
2 回答
184 浏览

c - C & Linux:等待文件被写入

我目前正在从事一个项目,该项目将通过串行通信从微控制器读取数据。

截至目前,该程序(在我的计算机上)打开一个/dev/tty*文件并能够读取/写入它。微控制器将n随时发送一个字节包。我想知道是否有任何方法可以告诉我何时将所有字节写入文件?

我一直在研究select()andpoll()函数,但它们似乎只能判断一个字节何时准备好,而不是何时写入每个字节。

任何帮助表示赞赏。谢谢!

0 投票
1 回答
2084 浏览

c - uart 16c950 linux速度高于B4000000(4Mbps)

大家,我正在使用 Ubuntu 下的高速 RS422 pci 板(OXPCIe958)。该设备可以以高达 15Mbps 的速度工作。我需要以 10Mbps 的速度工作,但我注意到在 Linux 下,如果我们使用 termois,可以指定的最大速度为 B4000000(4 Mbps)。

有没有办法在linux中指定自定义波特率?我尝试更改 termois.h 中的值:

但改变不起作用。我无法理解分配给 BXXXXXX 的值的含义!!

该设备在 linux 上原生运行,无需指定驱动程序。查看设备的数据表,我看到要指定目标波特率,我们必须设置一些寄存器来更改预分频器、锁存器除数和采样时钟。

根据数据表,波特率由下式给出:

波特率 = inputclock/(sampleClock*divisor*prescaler)

有没有办法在linux下设置这个寄存器?驱动程序在 8250.c 和 8250_pci.c

提前致谢

0 投票
1 回答
376 浏览

c - 如何使用用户空间 API 在 Linux 上禁用串行端口 SAK 选项?

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

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

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

0 投票
1 回答
32 浏览

configuration - 如何找出正在配置的终端?

假设您想通过TTL-232R-3V3 USB 电缆将 Ubuntu 13.04 台式计算机连接到运行单个 Linux 风格的嵌入式系统的 UART 接口,该系统不属于主要发行版。您自己的机器为您提供通过/dev/ttyUSB0. 因为您使用的是高级语言 ( pySerial ) 的框架,所以您知道您通过 C-struct 配置了一些终端选项termios

现在的问题是,您要配置的终端在哪里?您是否将这些信息发送到远程设备并进行配置?或者你只是简单地配置/dev/ttyUSB0你的系统如何解释接口?或者在 UART-to-USB 转换器电缆的逻辑中甚至可能发生一些配置?如果所有 3 个都是可能的,您将如何确定您的termios操作配置了哪组参数/dev/ttyUSB0

如果它使事情更容易解释,请考虑LF/CR处理的示例,根据您设置的标志,它可以包含 only LF, onlyCR或 both ,这对于 Windows 来说是典型的。不过,我的问题不仅限于这些选项。

注意:在我意识到我已经看到一些选项处于活动状态之后,我提出了这个问题,手册页声明在 POSIX 和 Linux 中不可用。

0 投票
1 回答
825 浏览

linux - Linux终端中的按键是否有预输入缓冲区?

Linux 是否缓冲在终端中键入的,以便您以后可以一次读取一个键

我问是因为我想捕捉 ESC 和箭头键按下,但找不到可靠读取代码的方法。我将终端置于非规范模式,并希望程序在没有输入时阻止,但如果有,我只想获取一个按键进行处理。

更新 2:箭头键只是一个例子。即使对于我的程序具有未知转义序列的键,我也需要识别按键。

有两种相互矛盾的情况:

  • read(1) 返回一个字符。对于功能键和 ESC 键,此字符均为 0x1b。要检查它是否是箭头键,您需要读取(1),如果仅按下单个 ESC,它将阻止。
    解决方案:阻塞读取(1),非阻塞读取(1)
    问题:如果第二次读取不匹配任何功能键,这可能意味着它是缓冲的 ESC 后跟一些序列,或未知的功能键。如何检测未知功能按键?

  • read(4) 最多返回 4 个字符,但是如果你按 ESC 四次让它缓冲,你会得到一个由 4 个 0x1b 组成的字符串。与上述相同的问题来找出是否有未知的功能键按下。

任何人都可以解释如何在 Linux 终端中处理这些问题,或者至少发布一个证明 Linux 只是没有用于键的输入缓冲区的证据吗?