Я написал программу Arduino, которая читает тележки GameBoy, Java отправляет ей символ для запуска, и она начинает читать и отправлять байты обратно. Открытие дампа рома в шестнадцатеричном редакторе (или даже текстовом редакторе) показывает, что на первый взгляд они одинаковы, после использования функции сравнения в редакторе становится ясно, что все символы 0x3F в дампе рома неверны - только они. Каждая функция моей программы Arduino была протестирована перед тем, как делать это, поэтому единственное, о чем я мог подумать, это протестировать сторону Java. Чтобы проверить это, я просто сделал еще одну простую программу Arduino, которая отправляет каждый символ ascii (0-255) по последовательному номеру рядом с его десятичным числом. Я понял, что на самом деле существует шесть различных представлений ? символ, вот эти части файла:
59: ;
60: <
61: =
62: >
63: ? <
64: @
65: A
66: B
...
125: }
126: ~
127:
128: €
129: ? <
130: ‚
131: ƒ
132: „
...
140: Œ
141: ? <
142: Ž
143: ? <
144: ? <
145: ‘
146: ’
147: “
...
154: š
155: ›
156: œ
157: ? <
158: ž
159: Ÿ
160:
Вот рассматриваемый код Java:
final Arduino board = new Arduino("COM5", 115200);
BufferedWriter rom = new BufferedWriter(new FileWriter("[ROM].gb"));
board.write((byte)0);
Thread.sleep(10000);
while (board.hasavailable() > 0) {
String data = new String(board.read(board.hasavailable()));
rom.write(data);
Thread.sleep(1000);
}
rom.flush();
rom.close();
Я не вижу в этом проблемы со связью, так как если бы скорость передачи данных была неправильной, это был бы мусор, конечно, то же самое было бы, если бы это была проблема текстового формата, такая как UTF-8 в ASCII... В основном Java должно быть запутано с '?' характер и всегда предполагая, что это первый экземпляр. Я что-то упустил при преобразовании byte[] в строку, потому что кажется, что это очевидная проблема сделать это так, как я.
ИЗМЕНИТЬ 1:
Я использовал asciitable.com в качестве ссылки, чтобы все символы были одинаковыми.
Я также обнаружил, что если я изменю код записи файла на это:
byte[] data = board.read(readsize);
for (byte in : data)
rom.write(in);
весь расширенный набор (128+) становится '?'s. Может ли это быть проблемой с bufferedWriter?
Изменить 2: воспроизводимый пример
Вот код Arduino и Java, который я использую.
После того, как Java запишет файл, проверьте его в шестнадцатеричном редакторе и убедитесь, что все символы, упомянутые выше, были изменены на 0x3F.
?
в качестве вывода по умолчанию. - person Sotirios Delimanolis   schedule 13.06.2014