我的程序应该模拟通常通过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创建的任何文件),并在该处发送文本命令。
当我手动键入命令时,所有功能都可以正常工作-我按预期的方式收到字符。但是,当我粘贴多行文本时,此代码仅收到第一个字节,直到我放置新的行符号(即使我粘贴的文本中有多个换行符号)。
有什么解决办法吗?
答案 0 :(得分:1)
有什么解决办法吗?
我不知道您使用哪种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()
...