Получение моего последовательного порта для общения с моим приложением Adobe Air - PullRequest
5 голосов
/ 04 ноября 2010

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

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, попробуйте переключить флаг новой строки, все с теми же результатами.Итак, расстроенный, я прочитал первые пару байтов, чтобы увидеть, что я получаю от серпрокси:

trace(socket.readByte().toString());

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

48 -84 -79 -84 -73 -79 46 48 -84 -78 51 -76 46 -78 -84 -76 53 48 -84 51 48 46 57 -84 -73 -78 46 -76 -84 -79 54 -79 46 -72 -84 -79 -79 -72 46 -76 -84 51 48 -84 51 -78 46 -73 -84 57 51 51 54 -115 10

Понятия не имею, что этозначит, я опускаю голову от стыда и брожу по стеку в надежде, что кто-то там может научить меня тому, чего я явно никогда не узнал в serialports101.

data

[SOLUTION]

The issue I was having was that ActionScript has no way to read parity bits. So, when it saw 10101100 (44 with even parity bit flipped), it read that as -84. Now that may seem strange, as it did to me, so you'll want to прочитать все об этом в Википедии.

Теперь, чтобы исправить эту странную проблему, мы просто должны быть уверены, что , если бит четности перевернут в 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);

Итак, у вас есть.

[/ SOLUTION]

1 Ответ

3 голосов
/ 04 ноября 2010

48 десятичных = 0 (ноль)

Итак, вы один правильный путь;вместо этого выведите их числовое значение (и потратьте некоторое время и на биты четности)

[edit]
и обратите внимание, что 46 decimal =.(точка)
54 десятичных = 6 (шесть)
51 десятичных = 3 (три)

наконец, обратите внимание, что 0,1,71.0,234.2 453,31.1, 72,8,161.4,118.2,30,32.7,9336 имеет неслучайное соединение с ± .0¬²3².6¬933 ..

, так что вы на самом деле довольнонемного ближе, чем вы думаете.
[/ edit]

...