안드로이드의 라이브러리를 사용하여 터미널 에뮬레이터에 연결 중이며,이 장치는 직렬 장치 (스위치)에 연결되어 전송/수신 데이터를 보여줍니다. 다른 라이브러리를 사용하여 직렬로 데이터를 보냅니다. 연결을 통해 데이터를 터미널 아래의 텍스트 상자를 통해 보내거나 터미널 자체에서 입력하고 두 경우 모두 키보드에서 Enter 키를 눌러 데이터를 보냅니다. 버튼을 눌러 명령을 보낼 수도 있습니다.무한 루프가 발생합니까?
제 활동에는 시리얼을 통해 연결된 장치로 USB를 통해 데이터를 보내기 위해 라이브러리 메소드를 호출하는 sendOverSerial
이라는 메소드가 있습니다.
public static void sendOverSerial(byte[] data) {
if(mSelectedAdapter !=null && data !=null){
mSelectedAdapter.sendData(data);
}}
이 활동은 클래스 인스턴스를 열고,이 클래스는 터미널 화면에 데이터를 쓰는 데 사용됩니다. 일반적으로 editText
및 buttons
을 통해 일련 번호로 데이터를 보내려는 경우 해당 활동에서 sendOverSerial
메서드를 호출합니다. 그러나 터미널 자체에 문자를 쓸 때이 새로운 인스턴스 write
메서드에서 선택됩니다. 그래서 그 인스턴스에서 sendOverSerial
메서드를 호출해야합니다. 내 문제는 내가 "TEST"를 작성하면 TEST를 호출하면 TEST가 무한 루프의 터미널에 쓰여지고, 계속 쓰는 것입니다. 왜 그런가? 내가 더 주석을 적어 놓은 것처럼 그것을 더 내려 보내면 그것은 예상대로 한 번 보냅니다. 라이브러리에서
public void write(byte[] bytes, int offset, int count) {
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
//infinite loop if I send from here
GraphicsTerminalActivity.sendOverSerial("TEST".getBytes());
super.write(bytes, offset, count);
if (isRunning()) {
doLocalEcho(bytes);
}
return;
}
Log.d(TAG, "CRs=== " + numCRs);
// 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];
}
}
//fine if I send from here, sends once
GraphicsTerminalActivity.sendOverSerial("SECOND TEST".getBytes());
super.write(translated, 0, translated.length);
// If server echo is off, echo the entered characters locally
if (isRunning()) {
doLocalEcho(translated);
}
}
Super.write : 다음 라이브러리에서 다른 클래스에 쓰기를 호출
public void write(byte[] data, int offset, int count) {
try {
mWriteQueue.write(data, offset, count);
} catch (InterruptedException e) {
}
notifyNewOutput();
}
의 bytequeue 클래스 방법이 때 자동으로 데이터라는지고 한
public void write(byte[] buffer, int offset, int length)
throws InterruptedException {
if (length + offset > buffer.length) {
throw
new IllegalArgumentException("length + offset > buffer.length");
}
if (length < 0) {
throw
new IllegalArgumentException("length < 0");
}
if (length == 0) {
return;
}
synchronized(this) {
int bufferLength = mBuffer.length;
boolean wasEmpty = mStoredBytes == 0;
while (length > 0) {
while(bufferLength == mStoredBytes) {
wait();
}
int tail = mHead + mStoredBytes;
int oneRun;
if (tail >= bufferLength) {
tail = tail - bufferLength;
oneRun = mHead - tail;
} else {
oneRun = bufferLength - tail;
}
int bytesToCopy = Math.min(oneRun, length);
System.arraycopy(buffer, offset, mBuffer, tail, bytesToCopy);
offset += bytesToCopy;
mStoredBytes += bytesToCopy;
length -= bytesToCopy;
}
if (wasEmpty) {
notify();
}
}
}
"무한 루프"와 같은 것은 없습니다. 조만간 배터리가 소모되고 일부 리소스가 소모되거나 일부 구성 요소가 작동하지 않습니다. 아니면 기다리는 것에 지쳐있을 것입니다. –
예, 특정 유형의 루프 이름입니다. 그리고 그것이 아니라고해도 건설적인 발언은 아닙니다. http://en.wikipedia.org/wiki/Infinite_loop – Paul
작성하는 코드를 게시하거나 요약 할 수 있습니까? 한 번의 전화가 쓸 수있는 시간이 무한정 "테스트"로 표시됩니까? –