我有一个通过 Prolific Serial 转 USB 电缆连接的硬件,我需要使用 socat 向该端口和 TCP 端口发送/接收流量。到目前为止,它已经安装完毕并且可以与 minicom 一起正常工作,使用:
minicom -D /dev/tty.usbserial -b 9600
Socat 使用以下方式在一个方向上工作到 TCP 端口:
socat /dev/tty.usbserial,clocal=1,nonblock=1,cread=1,cs8,ixon=1,ixoff=1 TCP4:localhost:8080
我如何让它以两种方式工作?我经常看到重复的字符或双线,这表明串行设置不正确,对吗?
谢谢!克里斯
编辑:一些示例代码(实际上并不以双向方式工作)。
Chris-MacBookAir:~ chrisbridges$ socat -d -d - /dev/tty.usbserial,clocal=1,nonblock=1,cs8,ixon=1,ixoff=1,ispeed=9600,ospeed=9600,icanon=1
2013/01/09 13:13:34 socat[8501] N reading from and writing to stdio
2013/01/09 13:13:34 socat[8501] N opening character device "/dev/tty.usbserial" for reading and writing
2013/01/09 13:13:34 socat[8501] N starting data transfer loop with FDs [0,1] and [3,3]
Run Code Online (Sandbox Code Playgroud) Linux 串口使用 low_latency tty 模式安全吗?该tty_flip_buffer_push功能是记录,它“不能从IRQ上下文中调用,如果端口- > low_latency是集”。尽管如此,无论是否设置了标志,许多低级串行端口驱动程序都会从 ISR 调用它。例如,mpc52xx 驱动程序在每次从其 FIFO 读取后无条件地调用翻转缓冲区。
ISR 中的低延迟翻转缓冲区的结果是在 IRQ 上下文中输入线路规则驱动程序。我的目标是从高速 mpc52xx 串行端口读取一毫秒或更短的延迟。设置 low_latency 实现了延迟目标,但它也违反了 tty_flip_buffer_push 的记录先决条件。
我写了一个简单的程序来管理命令行用户界面。
为此,我使用 Nodejs Readline API 来读取process.stdin流。
我的问题是,如果用户开始输入,然后按退格键,则整行将被删除并回退到默认提示样式;直到用户按下enter。它看起来像这样:
What's your phone number?:
# User start typing
What's your phone number?: 123
# User press backspace
> 12
Run Code Online (Sandbox Code Playgroud)
(您可以在 repo examples 文件夹中运行示例来测试它)
有没有办法防止这种行为?(或以某种方式隐藏它)
我正在开发一个新项目,我想与连接到我的 debian 机器的 FTDI 建立连接。我打算用 C 编写代码,而不是 C++。我的问题就在这里。我找到的所有示例都不完整,或者是为 c++ 编译器而不是 GCC 编译器制作的。
目标是与连接到 FTDI 的微控制器进行通信。为了调试,我想开始构建一个 Linux 应用程序,它能够:
是否有任何示例代码或教程可以实现此目的?
如果我成功了,我会将代码放在这里,以便新观众可以使用它!
编辑:
就像我说的,如果我有代码,我会发布代码,这对我有用:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define MODEM "/dev/ttyUSB0"
#define BAUDRATE B115200
int main(int argc,char** argv)
{
struct termios tio;
struct termios stdio;
struct termios old_stdio;
int tty_fd, flags;
unsigned char c='D';
tcgetattr(STDOUT_FILENO,&old_stdio);
printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]);
memset(&stdio,0,sizeof(stdio));
stdio.c_iflag=0;
stdio.c_oflag=0;
stdio.c_cflag=0;
stdio.c_lflag=0; …Run Code Online (Sandbox Code Playgroud) 我正在 ttyS1 port.ttyS0 上重生 /bin/bash 是我的控制台。下面给出了 inittab 条目。
::respawn:/bin/bash < /dev/ttyS1 > /dev/ttyS1 2> /dev/ttyS1
我的问题是如何禁用/终止重新生成,以便我可以将串行端口用于其他应用程序。
我想知道是否有人知道在 OSX 中管理 USB 串行端口名称的方法?例如,每当我连接特定的设备序列号时,我总是希望它是序列号 /dev/device1
我知道在 linux 中你可以通过 /etc/udev/rules.d/49-persistent-usb.rules 并添加一个设备规则来做到这一点 SUBSYSTEM=="tty", ATTRS{serial}=="1234567", SYMLINK+="device1"
什么是 Mac 等价物?提前致谢。
...也许这就像 /dev/tty.usb > /dev/device1 的普通符号链接一样简单
我编写了一个在 Android 4.4 Kitkat 设备上的自定义内核上运行的 Android 应用程序,它使用 Android 串行端口 API ( https://code.google.com/p/android-serialport-api/ ) 来打开串行端口“/dev/ttyACM0”是与我的串行设备关联的端口。该端口具有适当的“666”权限(crw-rw-rw),应用程序本身甚至具有 WRITE_EXTERNAL_STORAGE”权限。
但是,即使权限看起来正确,当我的应用程序尝试使用库打开所述串行端口时,它也会失败。在我的 java 代码中,如果我尝试执行“device.canWrite()”,它返回 false,而“device.canRead()”返回 true。我觉得这是更大权限问题的症状。
如果我使用与串行端口 api/library 捆绑在一起的示例 apk,我会遇到同样的问题,应用程序在 device.canWrite() 上失败并抛出 SecurityException。
当在自定义内核 ICS 设备上运行时,完全相同的代码确实成功运行并打开,应用程序最初是为该设备开发的。然而,两者的内核都是由同一个开发人员编写的,至少从表面上看,端口的权限似乎是一样的。
这可能是我可以在应用程序代码方面解决的问题吗?我尝试了一些其他的串口库(USBSerial3.0,usb-serial-for-android-master),我似乎遇到了同样的问题。
不管问题出在哪里,有人会知道问题可能出在哪里吗?对内核、应用程序和 API 进行更改都摆在桌面上。谢谢你。
我正在尝试构建一个全屏终端应用程序。我使用 Go 作为我选择的语言。我已经弄清楚如何读取os.Stdin,但我不清楚如何清除终端窗口并操纵光标位置。我还想捕获终端输入而不打印(回显)。
我的问题是:
我的意图:
我想创建一个全屏终端应用程序,它呈现自己的 UI 并在内部处理输入(热键/导航/等...)。
如果有任何库涵盖此类用例,请随时推荐它们。
我正在使用一个名为“paramiko”的 python SSH 库。它的使用方式如下:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user_name, password=password)
chan = ssh_pool[host].get_transport().open_session()
chan.exec_command(SOME_COMMAND)
Run Code Online (Sandbox Code Playgroud)
因为我需要在sudo中执行一些命令,所以我需要在exec_command之前调用chan.get_pty()以确保有可用的 tty 。
我发现在调用 get_pty() 后,标准输出从远程服务器返回,使用 \r\n 作为换行符而不是 \n。
例如:
>>> chan = ssh.get_transport().open_session()
>>> chan.exec_command("echo hello world")
>>> chan.recv(1000)
b'hello world\n'
Run Code Online (Sandbox Code Playgroud)
调用 get_pty() 后:
>>> chan = ssh.get_transport().open_session()
>>> chan.get_pty()
>>> chan.exec_command("echo hello world")
>>> chan.recv(1000)
b'hello world\r\n'
Run Code Online (Sandbox Code Playgroud)
我做了一些网络搜索,但找不到任何连接到pty / tty / newline / \r\n 的内容
我担心什么会导致这种变化。
为什么 paramiko 返回 \r\n 作为换行符而不是 \n?
我创建了一个简单的 pty 设置,但是我不确定如何在创建后实际写入主端或从端。我也不确定我的设置是否正确,因为经过检查,pty 的子进程的 Stdin、Stdout 和 Stderr 都是 None 而不是设置为从文件描述符。任何人都可以澄清这是否正确,如果不正确,您对如何解决它有任何建议吗?
use libc::{self};
use nix::pty::openpty;
use std::os::unix::io::FromRawFd;
use std::process::{Child, Command, Stdio};
#[derive(Debug)]
pub struct Pty {
process: Child,
fd: i32,
}
fn create_pty(process: &str) -> Pty {
let ends = openpty(None, None).expect("openpty failed");
let master = ends.master;
let slave = ends.slave;
let mut builder = Command::new(process);
builder.stdin(unsafe { Stdio::from_raw_fd(slave) });
builder.stdout(unsafe { Stdio::from_raw_fd(slave) });
builder.stderr(unsafe { Stdio::from_raw_fd(slave) });
match builder.spawn() {
Ok(process) => {
let pty = Pty {
process,
fd: …Run Code Online (Sandbox Code Playgroud)