0

更新的问题:我正在尝试使用 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;

}

当我在终端会话本身键入后按回车键时,根本没有出现新行。所以我不得不测试数据\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;
        }
    }

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

4

1 回答 1

0

编辑:不固定,以为我有,但是当我直接从终端输入时,输入不会产生新行。一定是因为 \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#
于 2013-01-07T12:24:12.833 回答