Я столкнулся с этой проблемой, когда мне понадобилось простое медицинское оборудование для вывода строки чисел, разделенных запятыми, в мое приложение Adobe Air. Я просто рад возможности поговорить с чем-то, кроме веб-службы!
Итак, я получил переходник с USB на последовательный, подключил к своему компьютеру и использовал программу под названием Cornflake , чтобы прочитать это из машина:
0,1,71.0,234.2,453,31.1,72.8,161.4,118.2,30,32.7,9336
Успех! Итак, я немного погуглил, и мне кажется, что serproxy - удобный инструмент, который любители Arduino используют для того, чтобы делать именно то, что мне нужно: серийник прошить. Итак, я загружаю, устанавливаю и настраиваю вот так:
newlines_to_nils=false
serial_device1=/dev/cu.usbserial
comm_ports=1,2,3,4
comm_baud=2400
comm_databits=7
comm_stopbits=1
comm_parity=even
timeout=300
net_port1=5331
...
Это те же настройки, которые я использовал в Cornflake. Я подключаю простой сценарий действий, чтобы прослушивать событие, и когда я ловлю событие данных, я делаю следующее:
private function onSocketData(event:Event):void {
var data:String = socket.readUTFBytes(socket.bytesAvailable);
trace(data);
}
Это выводит тарабарщину:
¬ ± ¬ · ± .0¬²3´ .0¬´53¬ 3 ±. ± ¬ · ².¸¬ ± 6 ± .²¬ ± ± ¸.0¬3 0¬3².6¬93 3 ±
Итак, я предполагаю, что читаю неправильную кодировку. Похоже, это должен быть ascii, поэтому я делаю следующее:
var data:String = socket.readMultiByte(bytes.bytesAvailable, "us-ascii");
Никаких кубиков. Поэтому я пробую кучу разных кодировок и получаю ту же тарабарщину. Я меняю последовательный порт на tty.usbserial, пытаюсь перевернуть флаг новой строки, все с теми же результатами. Итак, разочарованный, я прочитал первую пару байтов, чтобы увидеть, что я получаю от serproxy:
trace(socket.readByte().toString());
Похоже, я получаю отрицательные числа:
[РЕШЕНИЕ]
Проблема, с которой я столкнулся, заключалась в том, что ActionScript не может читать биты четности. Итак, когда он увидел 10101100 (44 с перевернутым битом четности), он прочитал это как -84. Теперь это может показаться странным, как и мне, поэтому вы захотите прочитать все об этом в Википедии.
Теперь, чтобы исправить эту странную проблему, нам просто нужно убедиться, что , если бит четности меняется на 1, мы возвращаем его обратно в ноль. Сделать это просто, потому что ActionScript считывает бит четности как отрицательный байт.
var text:String = "";
var tmp:int = socket.readByte();
var charCode:int code;
if(tmp < 0) //check to see if the parity bit was flipped to 1
{
code=tmp & 0x7F; //reset the parity bit to 0
}
else
{
code=tmp; //nothing to do if parity bit is 0
}
text+=String.fromCharCode(code);
Вот и все.
[/ РЕШЕНИЕ]