Я подключаюсь к эмулятору терминала, используя библиотеку в android, это подключается к последовательному устройству (коммутатору) и показывает мне отправленные/полученные данные. Я отправляю данные по последовательному, используя другую библиотеку. Я отправляю данные по соединению через текстовое поле под терминалом или, введя сам терминал и нажав кнопку ввода на клавиатуре в обоих случаях. Я также могу отправлять команды, нажимая кнопки.получение бесконечного цикла?
В моей деятельности у меня есть метод под названием sendOverSerial
, который просто вызывает библиотечный метод для передачи данных через usb на устройство, подключенное через последовательный порт.
public static void sendOverSerial(byte[] data) {
if(mSelectedAdapter !=null && data !=null){
mSelectedAdapter.sendData(data);
}}
Это действие открывает экземпляр класса, этот класс используется для записи данных на экран терминала. Обычно, когда я хочу отправлять данные через последовательный порт, через editText
и buttons
я вызываю метод sendOverSerial
в этом действии. Но когда я пишу персонажей в сам терминал, их собирают в этом новом экземпляре метод write
. Поэтому я должен вызвать метод sendOverSerial
из этого экземпляра. Моя проблема заключается в том, что если я назову его написать «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
можете ли вы опубликовать или обобщить код, который вызывает запись? Вы уверены, что он будет отображать «TEST» бесконечное количество раз для одного вызова для записи? –