问题标签 [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 投票
2 回答
1416 浏览

linux - ttyACM0 只读取 64 字节

我有点新手,但我有一个旧应用程序,它使用 ttyACM0 从设备读取 64 字节的 AES 加密数据。我现在需要读取 128 个字节。听起来很简单;增加缓冲区的大小等。但无论我尝试什么,我仍然只能读取 64 个字节。之后它只是挂起。我使用终端和 cdc-acm 驱动程序验证了 Windows 中的通信。设备不使用流量控制。我无法上传代码,因为它是专有的,但以下是一些片段:

初始化:CACS_RefID::Initialise() { int iRet = 1; 结构 termios dev_settings;

实施:

}

如果我在运行实现之前每次都进行初始化,我得到 128 个字节,但数据在 64 个字节后损坏。甚至在处理它之前,我就收到了很多 READ_ERROR。看起来原作者希望设备使用 select() 阻止,但事实并非如此。
系统中的 ttyACM0 缓冲区大小是否存在某种类型的限制?波特率与 ttyACM 驱动程序有关吗?读取所有字节后 read() 是否停止读取(认为前 64 个可用,然后是空的,然后是更多数据)?

倾注通过手册页,但我被阻碍了。任何帮助将不胜感激。

这是我的最新消息:

注意:无论选择错误如何,我现在都在读取数据,并且仍然只获得 64 字节。我已经联系了我的设备制造商。一定是发生了什么奇怪的事情。

0 投票
1 回答
325 浏览

c - Virtualbox 的退格字节码与实际的裸机操作系统不同

我正在玩非规范终端仿真并尝试将单个字符(我的输入)与退格键进行比较

在裸机操作系统上工作,但是当我在 virtualbox 中运行它时,它根本不起作用。如果我这样做,Virtualbox 只会检测退格键

这可能是因为仿真虚拟机正在干扰实际的键盘输入吗?

0 投票
0 回答
48 浏览

c++ - 从 Windows 到 linux 的串行通信

我有一台 Windows 机器连接到一台运行 Debian 的单板计算机,我正在尝试使用串行端口在它们之间来回发送字节。在 Windows 端,我的代码如下所示:

在 Linux 方面,我有:

当我在两端运行代码时,第一组 while 循环工作正常,windows 机器显示 0 到 255。第二组从不运行,linux 端read函数返回 0,表示端口关闭,windows 端报告它已写入所有请求的字节。这里发生了什么?

0 投票
1 回答
1151 浏览

c++ - 使用 gcc 和 termios 将 uint8_t 数组传递给 Arduino

我目前正在开发一个项目,该项目需要使用 termios 作为串行通信手段,在 g++ 编译程序和 Arduino ATMega2560 之间进行串行通信。g++ 程序发送由 Arduino 解析的 5 个 uint8_t 值的数组。然后 Arduino 使用这些字节来打开条带上的特定 LED。

下面是用 g++ 编译的 C++ 程序的代码:

这是 Arduino 草图:#include

g++ 程序的输出可以显示为一组字节,分组在一起{}表示对write().

arduino 可以很好地拾取前两个字节,并将每组 5 个发送的第一个字节正确解释为 0x73(也称为“s”),但是该组中的以下字节未正确读取并最终被解释由 Arduino 作为 255 的值。

预期的输出是:

这是实际的输出:

有人会碰巧知道是什么导致我的代码出现这种情况吗?起初我以为总线已经饱和,所以我尝试将波特率降低到 19600,但它没有解决任何问题。

编辑:另一个问题是,在设置 LED 的四五次迭代之后,绿色通道随机退出,所以 Arduino 得到的只是一个更加错误的 {'s', 255, 0, 255, 255}。

0 投票
1 回答
744 浏览

linux - TERMIOS:c_oflag 中的 OFILL 标志是做什么用的?

问题1:OFILLflag intermios_p->c_oflag是做什么用的。

这是文档中的内容:

延迟发送填充字符,而不是使用定时延迟。

为了解决这个问题,我创建了这个小测试程序:

当我运行程序时,如果设置或未设置标志,我看不到任何差异......我希望这个标志可以以某种方式更容易检测是否按下了ESC键。

Left-Arrow-key在上面的程序中,如果我按 the并且如果我按 sequence: ,我会看到完全相同的输出ESC [ D

问题2:我应该如何检测用户是否按下了ESC按钮以及我应该如何检测用户是否按下了`Left-arrow-button

由于这是学习终端 IO 系统如何工作的练习,所以我不想使用任何库。

0 投票
1 回答
719 浏览

termios - 在后台以 tcsetattr 原始模式运行程序

我需要在后台运行一个程序。问题是程序执行 tcsetattr() 调用并将原始模式设置如下:

这意味着,只要我使用“&”运行我的程序并按 Enter,该过程就会显示“已停止”。甚至 ps aux 输出也将“T”显示为进程状态,这意味着它没有运行。我怎样才能让这个程序在后台运行。问题是我不能修改这个程序。

有关完整的详细信息,实际上我需要使用带有 'sol' 的 ipmitool 作为后台进程。

任何帮助表示赞赏!谢谢

0 投票
0 回答
85 浏览

c++ - 分叉后串口配置不起作用

我编写了一个可以在前台或后台执行的程序。该程序使用串行端口进行通信。如果我在前台启动它(即它不分叉),一切运行正常。如果我从命令行将它作为守护进程启动,那么一切都运行良好。

仅在引导期间使用启动脚本在后台将其作为守护程序启动始终无法设置正确的波特率。它似乎以某种方式默认为 115200 bps,而不是我配置的:9600 bps。我使用标准的“termios”结构和相关函数来配置串口。串行端口是内核映像的一部分,而不是可加载模块。以下是相关代码:

绝对清楚:我可以从命令行将程序作为守护程序运行(即它将分叉),然后一切正常。只有在启动过程中使用 /etc/init.d 中的脚本启动程序时,波特率的配置才会失败。程序本身在后台运行良好。

任何想法这里可能有什么问题?

0 投票
1 回答
2476 浏览

linux - PARMRK termios 行为在 Linux 上不起作用

我正在尝试从使用标记奇偶校验作为地址字节和空间奇偶校验作为消息正文的设备接收消息。该设备是多点串行总线的“主机”。根据 termios 手册页,我正在使用 CMSPAR、PARENB、~PARODD、INPCK、~IGNPAR 和 PARMRK。我希望在每个地址字节上获得一个 3 字节序列: '\377' '\0' 。它不会发生......我总是得到地址字节(和正文字节),但没有前导 '\377' '\0' 字符。

我试图让 PARMRK 使用奇偶校验设置,以防不支持 CMSPAR。数据流中仍然没有 3 字节序列。我正在使用 Ubuntu 12.04 LTS。

n_tty.c:n_tty_receive_parity_error() 具有实现 PARMRK 的逻辑。8250_core.c 具有标记奇偶校验错误的逻辑。dmesg | grep ttyS0 显示 serail8250: ... 是 16550A。嗯...随后的消息显示 00:0a: ... 是 16550A。也许 8250 驱动程序实际上并没有处理 ttyS0?

有任何想法吗?即使你没有看到我做错了什么但让 PARMAR 工作,关于你的情况的评论可能对我有帮助。

更新:我的 Linux 在 VMware VM 中运行,所以我尝试了非 VM 配置,现在它可以工作了!如果有人知道,我仍然想知道为什么在 VM 中未检测到奇偶校验错误。

这是我的配置代码:

0 投票
2 回答
593 浏览

linux - 使用 termios.h 配置阻止 Linux 串行端口

我正在编写一个嵌入式 Linux 应用程序,它 (1) 打开与另一台设备的串行连接,(2) 发送已知命令,(3) 检查端口是否有传入字符(响应),直到检测到预期的响应短语或字符,(4 ) 重复第 2 步和第 3 步,直到发送了一系列命令并收到响应,(5) 然后关闭端口。

我的应用程序会经历上述序列的一些循环,并且当通信突然停止并且我的软件由于我的内置超时逻辑而出现故障时,它会时不时地等待响应(读取)。

我的端口配置中是否有任何内容会由于发送特定字节(可能是由于电噪声)而导致端口被阻塞?

这是我打开端口的方式(通过 termios.h 显示配置):

我无法弄清楚为什么当我重新启动设备时通信突然冻结然后又消失了。谢谢大家!

更多信息 - 这是我的读写功能:

0 投票
1 回答
7005 浏览

linux - 串口无响应

我编写了一个与串口通信的程序,使用termios,该程序将以非阻塞模式读取串口,并在读取数据后向串口写入响应。如果没有从串口读取数据,程序将执行其他操作,在下一个循环中,程序再次读取串口。

现在的问题是,在有时消失后,可能几分钟,或者几个小时,串口不再响应我的程序。即使我执行echo 'HB\n' > /dev/ttyUSB0(然后串口应该响应'HACK'),它不再响应了..

我什至不知道串口什么时候“死”,我没有任何线索..它“死”不合时宜。

这是我的配置:

在这种情况下很难调试串行。我真的不知道是什么原因导致地球上的串口“死”。我快疯了...

可能的原因是什么?任何帮助将不胜感激!

更新:

当串口“死”时,其配置为:

更新 2

/proc/tty/driver/ar933x-uart
我注意到这个txrx字段值在我的程序运行期间不会改变,即使我手动写入我的串行。

/proc/tty/驱动程序/串行

/proc/tty/驱动程序/usbserial

而且,下面是更详细的代码...

其他模块还有另一个功能可以写入串口