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