更新的问题:我正在尝试使用android中的库连接到终端模拟器,这将连接到串行设备,应该显示我发送/接收的数据。我应该能够通过终端下面的文本框或通过输入终端本身并在键盘上按回车键在连接上发送数据。
当我通过文本框发送数据时,我必须将n
附加到数据以获得新行,当我按enter键时,如下所示:
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
的数据并将其替换为rn
:
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
从文本框发送数据时,每个换行符之间都有一个额外的空格,以及获得额外的换行符。
所以我认为,当计算回车的数量时,在下一个字节提前窥视,如果它是'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;
}
}
这修复了空格的问题…但这是相当愚蠢的,因为我现在回到了原来的问题,如果我直接在终端中输入,没有新的行,因为它看到rn
,看到下一个字节是无效的。怎样才能把两者结合起来呢?我要么有这些奇怪的额外空格,所有的输入都没问题,要么有正常的空格,我不能直接从终端输入文本,只能从文本框输入。
编辑:不固定,以为我有,但当我直接从终端输入时,输入不产生新行。一定是因为n在r
之后被忽略了我已经修复了大部分问题。当计算回车的数量时,先看下一个字节,如果是'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#