重定向VxWorks串行输入

时间:2012-04-24 20:28:48

标签: c embedded vxworks

我正在尝试将所有串行数据重定向到VxWorks中的进程。使用以下代码

fd = open("/tyCo/0", O_RDWR,0);
ioctl(fd, FIOSETOPTIONS, OPT_TERMINAL & ~OPT_7_BIT);
read(fd, line, 100);

给出正确的输入,除了输入的第一个字符未填充,但打印到终端。因此,如果我输入“Hello”,则打印出“H”并且line =“ello”。如果我没有输入任何内容并点击返回键,我会收到来自VxWorks Shell的提示。

我认为VxWorks Shell正在拦截数据的第一个字母。我的猜测是我必须将STDIO重定向到新进程,但我发现的所有documentation都说使用了VxWorks 6.4 RTP中不可用的ioGlobalStdSet()。如何重定向STDIO或从我的进程中杀死VxWorks Shell?

3 个答案:

答案 0 :(得分:1)

如果您要将所有任务的输出重定向到当前登录Shell,我认为答案是:

static int shellResourceReleaseHookAdd_once = 0;

void revert_out()
{
    ioGlobalStdSet( 1, consoleFd ); /* redirect all output to the consoleFd */
    ioGlobalStdSet( 2, consoleFd ); /* redirect all error to the consoleFd */
}

void redirect_out()
{
    ioGlobalStdSet( 1, ioTaskStdGet(0,1) ); /* redirect all output to the current shell */
    ioGlobalStdSet( 2, ioTaskStdGet(0,1) ); /* redirect all error to the current shell */

    if (shellResourceReleaseHookAdd_once == 0) {
        shellResourceReleaseHookAdd(revert_out); /* call revert_out() when current shell closes. */
        shellResourceReleaseHookAdd_once = 1;
    }
}

答案 1 :(得分:0)

一种解决方法是使用ioGlobalStdSet将IO重定向到管道。 然后,在RTP中,以读取模式打开管道。

脱离我的头脑 - 在内核中:

dev = pipeDevCreate("/pipe/input", 10, 100);
kernFd = open("/pipe/input", O_RD, 0)
ioGlobalStdSet(1, kernFd)

在RTP中:

rtpFd = open(“/ pipe / input”,O_RD,0);    读(rtpFd,line,100);

答案 2 :(得分:0)

在VxWorks配置和编译期间禁用shell会永久删除问题。也可以在shell处输入exit以暂时禁用它。