Написах програма на Arduino, която чете GameBoy колички, Java й изпраща знак за стартиране и тя започва да чете и изпраща байтове обратно. Отварянето на изхвърления rom в шестнадесетичен редактор (или дори текстов редактор) показва, че те са еднакви на пръв поглед, след използване на функцията за сравнение в редактора, той подчертава, че всички 0x3F символи в изхвърления rom са неправилни - само те. Всяка функция, която има моята програма 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 трябва да се обърква с "?" характер и винаги се приема, че това е първият случай. Пропускам ли нещо, когато прехвърлям байта [] към низ, защото изглежда, че това е очевиден проблем да го направя така, както съм.
РЕДАКТИРАНЕ 1:
Използвах asciitable.com като референция, за да накарам всички герои да бъдат еднакви.
Също така открих, че ако променя кода за писане на файл на това:
byte[] data = board.read(readsize);
for (byte in : data)
rom.write(in);
всички от разширения набор (128+) стават '?'. Може ли да е проблем с буферирания Writer?
Редактиране 2: Възпроизводим пример
Ето кода на Arduino и Java, който използвам.
След като Java е написала файла, проверете го в шестнадесетичен редактор и вижте, че символите, споменати по-горе, са променени на 0x3F.
?
като изход по подразбиране. - person Sotirios Delimanolis   schedule 13.06.2014