Получение моего последовательного порта для связи с моим приложением Adobe Air

Я столкнулся с этой проблемой, когда мне понадобилось простое медицинское оборудование для вывода строки чисел, разделенных запятыми, в мое приложение 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());

Похоже, я получаю отрицательные числа:

data

[РЕШЕНИЕ]

Проблема, с которой я столкнулся, заключалась в том, что 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);

Вот и все.

[/ РЕШЕНИЕ]

5
задан Community 8 February 2017 в 14:30
поделиться