问题标签 [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 回答
24882 浏览

serial-port - 如何在 C 程序中通过串行终端读取二进制数据?

我阅读了关注的链接和其他来源,但没有找到我的问题的答案。

串行终端上的二进制数据

数据在通过串行端口传输期间损坏

我通过串行端口与我的嵌入式设备通信。默认情况下,嵌入式 Linux 使用此端口作为终端。但我也想通过端口传输二进制数据(服务包)。我的 /etc/inittab 文件有一个“getty”调用: console::respawn:/sbin/getty 115200 ttyS0

我还有带有字符串的 /etc/passwd 文件,其中“admin”用户在登录后启动我的“cli”应用程序: admin:8Mt/Jtxcyg8AY:1000:0:admin:/tmp:/tmp/cli

我在运行程序之前的默认 ttyS0 设置是:

因此,在我的 cli 程序中,我执行以下操作:

我尝试使用 read() 函数(使用 unsigned char 缓冲区)来获取二进制数据,但未能接收到正确的数据。我还初步再次打开 /dev/ttyS0 以获取 file_descriptor 并使用 read() func。

我的程序发送 3 个字节:0xAA、0x02、0xFE。但在 syslog 中,我总是看到设备收到不正确的符号:0x98、0xE6、0x18。

有什么事?如何获得正确的二进制数据?

我目前正在测试的整个代码。

0 投票
0 回答
117 浏览

c - C - 从流中读取煮熟的输入

我知道有很多关于“阅读输入”的问题,但为了澄清我正在尝试阅读熟输入。由于某种原因 fgets 没有煮熟(不确定这是默认情况还是我需要使用 termios 打开它)所以有什么帮助吗?ncurses 不是一个选项。

示例:输入 hey 然后退格,输出为 hey^H,表示原始输入模式

顺便说一句,我尝试通过 termios 打开规范模式,但我仍然无法获得熟输入。

0 投票
1 回答
15558 浏览

linux - termios.c_cflag 中的 CLOCAL 和 CRTSCTS 标志如何影响串行端口?

我想配置一个 UART 以在 Linux 中使用硬件流控制线 RTS 和 CTS。根据http://linux.die.net/man/3/termios,CRTSCTS 启用 RTS/CTS(硬件)流控制,CLOCAL 将串口配置为忽略调制解调器控制线。这两个标志似乎是矛盾的,你怎么能用 CRTSCTS 启用硬件流控制而忽略 CLOCAL 行?

0 投票
1 回答
1033 浏览

serial-port - 串口 zigbee 通信 - 一些错误的字符

我在ubuntu中的串行通信遇到了一些问题。我正在编写 C++ 代码以连接到我的 zigbee 节点,但问题不在于 zigbee 配置。由于 GTKTERM(ubuntu 的普通串行终端)正确读取数据。

我的串行连接的配置很简单:

8N1 9600 波特无 CTSRTS,无软件流控制。我的设置中一定有一些小错误,因为大多数字符都是正确的,但有些是错误的:91 变成了 11(10010001 -> 00010001,所以只有 1 位)。

这是设置连接的代码:

我还注意到,当您更改这些配置并更改程序并再次运行它时,这些配置未设置为默认值。因此,除非您更改它们,否则它们在程序的独立执行之间将是相同的。也许有人有一个所有默认值的列表,所以我总是可以在启动时恢复默认值。(我有第二个程序使用 fopen() 从串行通信流中读取数据,并且该程序仅在我第一次运行此代码以设置正确的配置时才“工作”)

知道这里出了什么问题吗?我读过这个:http ://www.easysw.com/~mike/serial/serial.html 但无法弄清楚。

我也尝试过的标志如下:

没有好的结果。如果您想了解更多信息,请询问。

0 投票
4 回答
2883 浏览

c++ - 为什么串口发送数据时会跳过数据?

我已经编写了一些 C++ 代码来通过串行与我的 arduino 通信。它只是尝试使用正弦和余弦在两个伺服电机上产生振荡,但它正在跳过数据。我不确定为什么会这样。我将 termios.h 用于串行内容。C++ 的输出类似于“V180H90”,即垂直 180,水平 90。我之前使用 fstream 和 usleep() 发送数据并且它正在工作,但我想使用比延迟一些任意数字更好的方法.

感谢您的任何帮助或指导。

我的arduino代码

我的 C++ 代码

0 投票
1 回答
770 浏览

c - 在 Telnet 会话中处理转义序列

我借用了一个简短的 C 代码,它使用子父方案建立 telnet 会话,并通过伪终端设备处理两个进程之间的通信。

代码运行得很好,但有一个主要缺陷,telnet 进程不执行大多数转义序列,而是打印它们(ESC 打印 ^[[, arrows ^[[A ^[[B ^[[C ^[[D, ETC。)。

我现在已经做了很多研究,但我找不到任何好的资源来解释你应该如何处理或传递用户输入,以便最终过程可以适当地解释特殊代码,从而实现真正的交互式会话。

基本代码:http ://dl.dropbox.com/u/15117414/pty.c

0 投票
0 回答
2267 浏览

c++ - tcsetattr() 失败

&"警告:GDB:设置控制终端失败:设备的 ioctl 不合适\n"

我发现了问题,这是因为 tcsetattr() 返回输入/输出错误。设备以写入权限打开。和...当我做 dmesg | grep ttyS0 或 S1-3,我什么都没有收到!有时还会出现错误“没有这样的设备”。

任何人都可以帮助解决这个问题?

0 投票
0 回答
1665 浏览

c - 尽管旧属性被重置,termios 在退出后在终端中弄乱了标准输出

我在串行日志记录应用程序中使用 termios,该应用程序读取串行端口并将数据保存在文件中。它还接受来自标准输入的输入并将其发送到串行端口。

问题是,一旦应用程序退出(通过按“q”),bash 终端设置就会混乱,并且会输出奇怪的字符(见图)

终端输出数据来自中间的串口,当按下 q 时奇怪的终端行为

将属性设置回原来的成功:resultetatr=tcsetattr(STDIN_FILENO,TCSAFLUSH,&oldstdio); 并失败:resultetatr=tcsetattr(STDIN_FILENO,TCSAFLUSH,&oldstdio);

如程序终止前所示。

该程序在带有 USB 到串行适配器的 Raspberrypi 上运行。

相关的代码是:

0 投票
2 回答
6485 浏览

c - Linux termios 修改串口 read() 后的第一个字符

我的 termios 设置正在修改使用 read() 从串行端口读取的第一个字符。我有一个微控制器与一个 linux 盒子交谈。微控制器响应从 linux 机器发送的命令。设置如下:

  • 微控制器(PIC24F)RS485 端口 <--> RS485 到 USB 转换器 <--> Ubuntu PC。

当我运行诸如 Cutecom 之类的终端程序时,一切都按计划进行。我向 PIC 发送了一个命令字符,然后我得到了响应,但是当我使用我的命令行程序时,第一个字符正在被修改。这是我的代码:

这是我得到的结果示例。

  • 当 PIC 发送“00000\n”时,输出为: 读取:6 START-16 48 48 48 48FINISH
  • 当 PIC 发送“23456\n”时,输出为:读取:6 START-14 51 52 53 54FINISH
  • 当 PIC 发送“34567\n”时,输出为:读取:6 START-14 52 53 54 55FINISH
  • 当 PIC 发送“45678\n”时,输出为:读取:6 START-12 53 54 55 56FINISH
  • 当 PIC 发送“56789\n”时,输出为:读取:6 START-12 54 55 56 57FINISH

出于某种原因,第一个字符被某些 termios 设置弄乱了。它必须是 termios 设置,因为上面相同的测试输入在我运行 Cutecom 时完全返回。我一遍又一遍地阅读手册页,在输入控件上尝试了所有不同的设置,但无论我做什么都无法解决这个问题。

为了一个简单的修复,我可以将我的数据转移到 1 个字符上,但希望避免这样做。

有没有人遇到过这样的问题或知道该怎么做?

非常感谢。

28/3/13 很好的建议奥斯汀。对于那些对此感兴趣的人,有两个输出:

  • 首先是我程序中的 termios 设置

    速度 38400 波特;第 0 行;第 0 列;线 = 0; 内部 = ; 退出 = ; 擦除 = ; 杀死 = ; eof = ; eol = ; eol2 = ; 开关 = ; 开始 = ; 停止 = ; 怀疑 = ; rprnt = ; 错误 = ; 下一个 = ; 冲洗 = ; 最小值 = 0; 时间=0;-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig icanon -iexten -echo -echo -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

  • 还有cutecom使用的设置

    速度 38400 波特;第 0 行;第 0 列;线 = 0; 内部 = ^C; 退出 = ^\; 擦除 = ^?; 杀死 = ^U; eof = ^D; eol = ; eol2 = ; 开关 = ; 开始 = ^Q; 停止 = ^S; 悬念 = ^Z; rprnt = ^R; 错误 = ^W; 下一个 = ^V; 冲洗 = ^O; 最小值 = 60;时间=1;-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr - onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echo -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

我仍在经历这一切,当我取得进展时会更新帖子。

29/3/13 仍然有同样的问题。我什至找到了 Cutecom 的源代码,并遵循了他们使用的 termios 设置。问题仍然存在。第一个字符已损坏!!!!

  • 这是我程序中的 Termios 设置。由于某种原因无法设置冲洗。

    速度 38400 波特;第 0 行;第 0 列;线 = 0; 内部 = ^?; 退出 = ^\; 擦除 = ^H; 杀死 = ^U; eof = ^D; eol = ; eol2 = ; 开关 = ; 开始 = ^Q; 停止 = ^S; 悬念 = ^Z; rprnt = ^R; 错误 = ^W; 下一个 = ^V; 冲洗 = ; 最小值 = 60;时间=1;-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr - onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echo -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

  • 还有我的新代码:

    /li>

我完全不知道可以做什么或应该从这里拿走它。

0 投票
1 回答
5509 浏览

python - 如何让 Python 模块 termios 在 Cygwin 中工作?

我想在 Windows 中运行Urwid,所以我下载并安装了 Cygwin(仅限默认包)。我尝试了 Hello World 示例:

但它抱怨termios

我回到安装程序并安装了所有与term搜索词匹配的软件包,但我仍然得到同样的错误。

拜托,你们所有的 Cygwin 神,你能帮助一个软弱的菜鸟解决这个烦人的问题吗?

编辑:如果这很重要,我正在 Windows 7 上运行 Python 2.7.2。