read data from socket from SerialForwarder - matlab

With tinyos there is SerialForwarder which forwards the data to a socket.
I have tried to open socket with host:"localhost",,port="9001" ,, but this will always return two bytes ="T!" !!
Then I try to open a TCP connection with same properties but I got this warning :
warning unsuccessful read a timeout occurred before the terminator was reached
How to read the data from SerialForwarder?

You have to read thoroughly the serial stack...its not very easy but its do able.
You can directly read from serial port. You don't need serial forwarder in this case. There are few things to take care of.
For example if you want to read a serial message that is being send to serial port of your PC (usb sensorboards just work like serial, since they are using usb to serial converters lik FTDI chip).
in C# (same for Java, etc...) you can read byte streams that are coming in the serial port. You can parse this byte streams to extract a standard serial message of tinyos.
This is somehow explained in TEP #113 although it has some problems, but you should be able to find those problems and make your program work.
As it stated in TEP 113, a standard serial packet is something like:
7e 40 09 00 be ef 05 7d 5d 06 01 02 03 04 05 7e
That means, a packet starts with hex 7E ( I believe its 126 or 127) and ends also with 7E. The last 2 bytes are CRC of the packet. So you can in your c# program start reading from serial port when you encounter 7E and stop reading when you reach the next 7E in the stream. Everything in between will be your packet.
You have to be careful of escaping that is if a 7E is part of your packet content, to be not be confused with start and end dilimeters, it will be escaped to something else...that's also is explained in that TEP 113.
I believe there were some C++ code fro calculating the CRC that you can easily convert it to C# or Java code.
Also check the source code of Serial.h which contains some details about how a serial packet is being formed in TinyOS.

Related

What is the usage of MBR hex dump and what kind of think can be do using it?

I take copy bytes dump using my Ubuntu os(MBR sector) following command.
dc3dd if=/dev/sda of=x cnt=1 ssz=512 hash=sha256 mlog=hashes
And I convert it to hexdump using following command.
hexdump x > hex_x
I receive out put like this .
I have some experts hep to analysis this hex_dump. I need to know what are the benefit of getting MBR hex dump and what kind of thing can be do using it ? (Eg: can I tell my system os like information analyzing this ? )
Need to know ,are there any commands or tools to more deep analyzing and convert this hexdump to human readable way ?
Q. what are the benefit of getting MBR hex dump and what kind of thing can be done using it?
A. Microsoft says:
The MBR contains a small amount of executable code called the master boot code, the disk signature, and the partition table for the disk.
The master boot code and disk signatures aren't very useful for someone (investigator). However the partition table gives a lot of information, and it can be used to extract information, in scenarios, where OS is corrupted or not booting and MBR can be used to investigate disk drive and operating system.
Sample Partition Table Record: (taken from an MBR, using HEX editor)
80 20 21 00 07 7E 25 19 00 08 00 00 00 38 06 00
Each hexadecimal value has some specific meaning, for instance:
80 => Partition type, Active
20 21 00 => Partition’s starting sector, Cylinder-Head-Sector (CHS)
07 => File System, NTFS
7E 25 19 => Partition’s ending sector, CHS
00 08 00 00 => Starting sector
00 38 06 00 => Size of the partition, 199 MiB
You can read them in detail in Table 1.2 Partition Table Fields, at official site.
Q. are there any commands or tools to more deep analyzing and convert this hexdump to human readable way?
A. You can use any HEX editor, like Hex Editor Neo or Active Disk Editor. These editors will help you in understanding MBR, but there is no magic tool available to to convert hexdump into human readable format (based on my knowledge).
PS: The question is pretty old, I wasn't available earlier so please accept late answer... :)

What is the 0x43 MIDI event?

I'm trying to write a MIDI parser, but I'm reaching a MIDI event that isn't documented in the official documentation (namely http://www.midi.org/techspecs/midimessages.php).
In one of the MIDI files that I have, I notice that immediately after a note-on event of 81 70 90 3c 00, I get the following bytes: 00 43 1e. However, I have not seen any documentation about 0x43 acting as a MIDI event identifier. How should I interpret 0x43, and where can I find more information about that?
Edit: The MIDI is interpretable, because I've loaded it up into Logic Pro without issues. Additionally, my interpretation up to the 0x43 has been accurate.
81 70 90 3c 00 00 43 1e
81 70: delta time (240 ticks)
90 3c 00: Note-On message (actually note off)
00: delta time
43 1e: Note-On message, using running status.
The MIDI Specification says:
RUNNING STATUS
For Voice and Mode messages only. When a Status byte is received and processed, the receiver will remain in that status until a different Status byte is received. Therefore, if the same Status byte would be repeated, it can optionally be omitted so that only the Data bytes need to be sent. Thus, with Running Status, a complete message can consist of only Data bytes.
Running Status is especially helpful when sending long strings of Note On/Off messages, where "Note On with Velocity of 0" is used for Note Off.
Status bytes always have the most significant bit set (80–FF), while Data bytes always have it clear (00–7F). Therefore, it is always possible to distinguish between them.

Losing Data at TCP transfer

My problem is losing Data over my TCP Data transfer.
I've built a homemade AVR based web-server (or at least trying to).
I'm able to communicate with the client PC (my PC), and I'm able to send a few HTML lines (total data <100 bytes), no problem there.
But when I want to sent my basic home page (~1KB), I'm only getting in WireShark 181bytes of data.
I suspect the problem lies in the construction of the TCP.
data below are in hex format
From client(my PC):
sequence number: de db c7 b1
ack number: 00 0a 00 0b
From server(AVR):
sequence number: 00 0a 00 0b
ack number: de b6 c9 18
Total TCP Length: 935byte, IP and TCP header 20-20 byte
What settings did I set wrong?
TCP is a stream and there is no guarantee that each send will result in exactly one recv. You need to call send repeatedly until all bytes are sent, and on the other end you need to recv repeatedly as well, appending new data to the end of a buffer on each subsequent successful recv... You cannot ignore the return codes from the send/recv calls, you must use it to know how much data is sent/recvd.
Problem Solved!
ENC28J60_CS();
ENC28J60_CMD(WCR,ETXNDL);
SPIWR(package_length);
SPIWR(16+(package_length>>8));
ENC28J60_DS();
package_length is a integer, so is the ETXNDL(register).
Until now the second SPIWR() function sent only the value 16: SPIWR(16);
So the problem was, I never added the high-byte of the package_length to the 16, so the chip always sended 1-255 byte long packages.
why 16?
RX buffer starts at 0x0000, and ends at 0x0fff.
TX buffer starts at 0x1000, and ends at 0x1fff.

Why is TeraTerm not putting out the same bytes that are in the send call?

Using TeraTerm and a Serial port adapter I ran a Macro with this line on it:
send $55 $0B $00 $00 $00 $BB $42 $AA
The $BB was sent out as two different bytes instead of just one. I forget which ones they were specifically but the result on the O-scope looked like this:
55 0B 00 00 00 C8 E9 42 AA
Does anyone know why this is?
I looked in the Manual and verified that Send8Ctrl is set to off and so is the Debug option.
Did the research, tested and verified that the answer to the question is that TeraTerm is using UTF-8 instead of English under the general settings menu. There are two options present that may be confusing so the two options are 'English' and 'Default'.

Why do I get an unexpected result when using socket.readUnsignedInt() in Adobe Air?

I have two air applications that communicate with each other using sockets.
Code on app 1
socket.writeUnsignedInt(4);
Code on app 2
socket.readUnsignedInt();
I am expecting the result of readInt() to be '4' (the int I sent) but I get '262144'
any help would be much appreciated.
The 262144 value in hex is 00 04 00 00, most likely your stream is out-of-sync, i.e. you read too few bytes from it before readUnsignedInt() call.