【问题标题】:Android - Strip extra \r\n's in stream?Android - 在流中去除额外的\r\n?
【发布时间】:2013-01-18 18:50:13
【问题描述】:

更新的问题:我正在尝试使用 android 中的库连接到终端仿真器,这将连接到串行设备,并且应该向我显示发送/接收的数据。在这两种情况下,我应该能够通过终端下方的文本框或通过输入终端本身并在键盘上按 Enter 来通过连接发送数据。

当我通过文本框发送数据时,当我按下回车键时,我必须将\n 附加到数据以进入新行:

mEntry = (EditText) findViewById(R.id.term_entry);

mEntry.setOnEditorActionListener(new TextView.OnEditorActionListener() {

    @Override
    public boolean onEditorAction(TextView v, int actionId,
            KeyEvent event) {

        /* Ignore enter-key-up events. */
        if (event != null && event.getAction() == KeyEvent.ACTION_UP) {

            return false;
        }

        Editable e = (Editable) v.getText();
        String data = e.toString() + "\n";
        sendOverSerial(data.getBytes());
        TextKeyListener.clear(e);
        return true;
    }
});

还有写法:

public void write(byte[] bytes, int offset, int count) {

super.write(bytes, offset, count);

if (isRunning()) {
    doLocalEcho(bytes);
}
return;

}

当我在终端会话本身键入后按 Enter 键时,根本没有出现新行。所以我不得不测试\r 的数据并将其替换为\r\n

  private void doLocalEcho(byte[] data) {
 String str = new String(data);   
    appendToEmulator(data, 0, data.length);
    notifyUpdate();
}

 public void write(byte[] bytes, int offset, int count) {
    // Count the number of CRs
 String str = new String(bytes);
    int numCRs = 0;
    for (int i = offset; i < offset + count; ++i) {
        if (bytes[i] == '\r') {
            ++numCRs;
        }
    }

    if (numCRs == 0) {
        // No CRs -- just send data as-is
        super.write(bytes, offset, count);

        if (isRunning()) {
           doLocalEcho(bytes);
        }
        return;
    }

    // Convert CRs into CRLFs
    byte[] translated = new byte[count + numCRs];
    int j = 0;
    for (int i = offset; i < offset + count; ++i) {
        if (bytes[i] == '\r') {
            translated[j++] = '\r';
            translated[j++] = '\n';
        } else {
            translated[j++] = bytes[i];
        }
    }

   super.write(translated, 0, translated.length);

    // If server echo is off, echo the entered characters locally
    if (isRunning()) {
        doLocalEcho(translated);
    }
}

所以效果很好,现在当我输入终端会话本身并按回车键时,我得到了我想要的换行符。但是现在每次我从带有\n 的文本框中发送数据时,每个换行符之间都会有一个额外的空格,并且获得额外的换行符。

http://i.imgur.com/gtdIH.png

所以我认为在计算回车数时,请先查看下一个字节,如果是'\n',则不要计算:

 for (int i = offset; i < offset + count; ++i) {

        if (bytes[i] == '\r' && 
                  ( 
                    (i+1 < offset + count) && // next byte isn't out of index 
                    (bytes[i+1] != '\n')
                  ) // next byte isn't a new line 
               ) 
        {
            ++numCRs;
        }
    }

这解决了空格的问题......但这很愚蠢,因为我现在回到原来的问题,如果我直接在终端中输入没有新行,因为它看到 @987654331 @ 并看到下一个字节无效。让两者一起工作的最佳方式是什么?我要么有这些奇怪的额外空格,所有输入都很好,要么是正常间距,我不能直接从终端输入文本,只能输入文本框。我认为它真的很容易修复,我只是在挠头。

【问题讨论】:

    标签: android stream terminal serial-port terminal-emulator


    【解决方案1】:

    编辑:不固定,以为我有,但是当我直接从终端输入时,输入不会产生新行。一定是因为 \r

    之后的 \n 被忽略了

    我已经修复了大部分。计算回车数时先看下一个字节,如果是'\n',则不计算:

     for (int i = offset; i < offset + count; ++i) {
    
                if (bytes[i] == '\r' && 
                          ( 
                            (i+1 < offset + count) && // next byte isn't out of index 
                            (bytes[i+1] != '\n')
                          ) // next byte isn't a new line 
                       ) 
                {
                    ++numCRs;
                }
            }
    

    现在剩下的唯一问题是我仍然像这样得到两次提示:

    switch#
    switch#
    

    【讨论】:

    • 这是一个针对终端应用程序的老问题。您确定终端没有允许您控制回声行为的行为设置吗?可能是正确的解决方案根本不是程序化的。
    • 嗯,我认为 echo 始终处于开启状态,对此我无能为力。可能是这种情况,我只需要测试一下,看看是否有任何情况我只得到一个提示。
    • 这真的不是我的专业领域,除了很多年前我为公告板写了一个脚本......这相关吗? tldp.org/HOWTO/Remote-Serial-Console-HOWTO/…
    • also - SET TERMINAL NEWLINE-MODE { OFF, ON } 告诉您在终端屏幕中按 Enter 键时要发送的内容。通常只发送回车 (CR)。 SET TERM NEWLINE ON 表示发送 CR 和换行 (LF)。仅当 Enter 键在终端屏幕中似乎没有产生适当的效果时才使用此命令。注意:这类似于 SET TERMINAL CR-DISPLAY,但方向相反。 -- columbia.edu/kermit/k95manual/setterm.html
    • 谢谢休,我会调查的,很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多