我的程序是应该以仿真通常通过COM端口连接的外部设备(的/ dev / ttyUSB0)。该程序打开的命令的PTY和等待。下面是代码:
HostPty::HostPty(const string & HostPty_name)
{
char name[100] = {0};
int res = openpty(&_master, &_slave, name, NULL, NULL);
printf("Name: %s\n", name);
}
string HostPty::nextString()
{
static const int BUF_SIZE = 4096;
char buf[BUF_SIZE];
size_t idx = 0;
while(true)
{
// Read symbols one by one until new line is found
size_t received_size = read(_master, buf + idx, 1);
printf("Received a symbol: %02x\n", buf[idx]);
// Stopping at new line
if(buf[idx] == '\n')
break;
idx++;
}
return string(buf, idx);
}
为了测试这个代码我使用miniterm.py终端仿真器连接到/ dev / PTY / 6(或任何与openpty创建)和发送文本命令在那里。
当我键入命令手动一切工作正常 - 我收到字符一一预期。但是,当我粘贴了一块多行文本的,直到我把一个新的线符号(即使有在我将文本粘贴多个新行符号)这段代码只接收第一个字节。
任何想法如何解决呢?
任何想法如何解决呢?
我不知道你是哪一种类型的Unix。我只是想重现Linux下你的问题。但粘贴行我的电脑上工作得很好,所以我不能重现该问题。
如果您的UNIX系统有一个系统调用跟踪器(Linux操作系统:strace
,在SunOS / Solars:truss
,FreeBSD的:strace
,MacOS的:dtruss
()),我会跟踪系统调用:
strace -f -o file_myprog.out ./my_program
miniterm /dev/pty/6
(注意,这意味着通过-f
创建的子进程的系统调用也调试的fork()
,这是必要的,因为Python会产生这样的子流程。)
现在重现的情况时,该程序不正确的行为,并杀死my_program
使用pkill -KILL my_program
。 (发送-KILL
信号,以确保my_program
立即死亡。)
再次做到这一点 - 这一次调试miniterm
并在“错误的情况下”杀miniterm
:
./my_program
strace -f -o file_miniterm.out miniterm /dev/pty/6
在两个输出文件的末尾(file_myprog.out
和file_miniterm.out
),你可以看到最后的“行动”你杀了他们之前的两个方案正在做。有可能的各种情况:
miniterm
被传送数据到/dev/pty/6
但你的程序没有收到任何数据。在这种情况下,与虚拟控制台本身出现了问题。miniterm
没有将数据发送到/dev/pty/6
出于某种原因。在这种情况下,你有miniterm
问题。miniterm
甚至没有收到使用read()
粘贴的数据...