473,386 Members | 1,962 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

sending binary files to a 16 micro controller.

Hi, I'm working on a project were a need to be able to upload firmware
to a microcontroller based Ethernet device. But because of the memory
constraints the controller can only handle packages of 300 bytes each
time. So therefore the firmware file must be sent in chunks and i need
a header in each file describing which part of the file it is I'm
sending. Could anyone give me some pointer on how a could accomplish
that in python? I'm talking about the client that uploads the software
to the device via TCP.

Best regards

Johnny Karlsson

Aug 22 '05 #1
12 1967
jo*************@gmail.com wrote:
Hi, I'm working on a project were a need to be able to upload firmware
to a microcontroller based Ethernet device. But because of the memory
constraints the controller can only handle packages of 300 bytes each
time. So therefore the firmware file must be sent in chunks and i need
a header in each file describing which part of the file it is I'm
sending. Could anyone give me some pointer on how a could accomplish
that in python? I'm talking about the client that uploads the software
to the device via TCP.


You can probably start here:
http://docs.python.org/lib/socket-example.html

If you're uncertain about the exact content of the transmitted
messages, and has access to some other client program, you could
write a Python server and see exactly what bit pattern the other
client sends. Then you can write a Python client that behaves the
same way.

The basic pattern to split and transmit your file would probably
be something like:

f = open('filename')
header_template = 'Chunk %05i, %03i bytes'
for i, bytes in enumerate(f.read(max_number_of_bytes_per_chunk)):
msg = header_template % (i, len(bytes))
msg += bytes
sock.send(msg)
sock.send('The end!')
Aug 22 '05 #2
Magnus Lycka wrote:
header_template = 'Chunk %05i, %03i bytes'


BTW, if the header is binary, you probably want to have a look at
the struct module. http://docs.python.org/lib/module-struct.html
Aug 22 '05 #3
On 2005-08-22, jo*************@gmail.com <jo*************@gmail.com> wrote:
I'm working on a project were a need to be able to upload firmware
to a microcontroller based Ethernet device. But because of the memory
constraints the controller can only handle packages of 300 bytes each
time. So therefore the firmware file must be sent in chunks and i need
a header in each file describing which part of the file it is I'm
sending. Could anyone give me some pointer on how a could accomplish
that in python? I'm talking about the client that uploads the software
to the device via TCP.


You have no control over packet size in TCP if you use the
normal socket interface. About the only thing you can to is
put delays between calls to send() in hope that the TCP stack
will send a packet.

If you really do want control over packet size, you'll have to
use a raw socket and impliment TCP yourself.

--
Grant Edwards grante Yow! After THIS, let's go
at to PHILADELPHIA and have
visi.com TRIPLETS!!
Aug 22 '05 #4
On 2005-08-22, Magnus Lycka <ly***@carmen.se> wrote:
Hi, I'm working on a project were a need to be able to upload firmware
to a microcontroller based Ethernet device. But because of the memory
constraints the controller can only handle packages of 300 bytes each
time. So therefore the firmware file must be sent in chunks

[...]
The basic pattern to split and transmit your file would probably
be something like:

f = open('filename')
header_template = 'Chunk %05i, %03i bytes'
for i, bytes in enumerate(f.read(max_number_of_bytes_per_chunk)):
msg = header_template % (i, len(bytes))
msg += bytes
sock.send(msg)
sock.send('The end!')


It's very probable that the TCP stack will combine chunks and
send out full Ethernet frames (4K bytes).

You're probably going to have to either put a time delay in the
loop, or wait for each chunk to be acknowledged before sending
the next one.

--
Grant Edwards grante Yow! Are we live or
at on tape?
visi.com
Aug 22 '05 #5
aaah, well i believe that in Windows XPSP2 has disabled raw socket
support (yes i sadly have to use windows) so that's no option. But I'll
try to put a time delay and check what happens. Or otherwise perhaps i
could do a socket.close each time, but that's a terrible waste of
packets.

Aug 22 '05 #6
On 2005-08-22, jo*************@gmail.com <jo*************@gmail.com> wrote:
aaah, well i believe that in Windows XPSP2 has disabled raw socket
support (yes i sadly have to use windows) so that's no option. But I'll
try to put a time delay and check what happens. Or otherwise perhaps i
could do a socket.close each time, but that's a terrible waste of
packets.


I doubt the other end is expecting you to close the socket after
each packet. Unless it was designed to tolerate that, it might
not work. A time delay of a few hundred ms will probably work.
I once wrote a Linux driver that could be used to wait until
the TCP out queue was empty, but that won't do you much good on
Windows.

--
Grant Edwards grante Yow! Is this ANYWHERE,
at USA?
visi.com
Aug 22 '05 #7

"Grant Edwards" <gr****@visi.com> wrote in message news:11*************@corp.supernews.com...
It's very probable that the TCP stack will combine chunks and
send out full Ethernet frames (4K bytes).

You're probably going to have to either put a time delay in the
loop, or wait for each chunk to be acknowledged before sending
the next one.


Yes, although it would be a rather perverse design from the
controller point of view (it's not clear to me whether that is
a given).
Aug 22 '05 #8
I'm going to try the timed wait alternative, if i get it the
application to work properly i'll post the results in this group and
the code if anyone want's it. It's such a contrast to code a tcp-server
for the microcontroller (MC9S12NE64) in C and coding in python :-) I
really hope embedded python takes of again!

Aug 22 '05 #9
jo*************@gmail.com wrote:
I'm going to try the timed wait alternative, if i get it the
application to work properly i'll post the results in this group and
the code if anyone want's it. It's such a contrast to code a tcp-server
for the microcontroller (MC9S12NE64) in C and coding in python :-) I
really hope embedded python takes of again!


You mean you wrote the TCP server in the micro in the first place? You
must already know about its restrictions then and, more importantly,
what it expects in the way of time delays and such. Also, couldn't you
have supported UDP as well? It's simpler and on the PC side you can
ensure that small packets are sent without being combined or any such
monkey business.

As for embedded Python, it's very unlikely any Python that might ever be
shoe-horned into an HC12 is going to support enough of Python to make
this a no-brainer. And Python doesn't itself provide the TCP stack, so
even this wouldn't have helped.

-Peter
Aug 22 '05 #10
Grant Edwards <gr****@visi.com> wrote:
You have no control over packet size in TCP if you use the
normal socket interface. About the only thing you can to is
put delays between calls to send() in hope that the TCP stack
will send a packet.
You can set the MTU (maximum transfer unit) for that interface. You
do with with ifconfig under un*x - I expect windows has an interface
to do it too (perhaps ipconfig?)

For ethernet the MTU is 1500 bytes normally.
If you really do want control over packet size, you'll have to
use a raw socket and impliment TCP yourself.


Actually I'd recommend the OP uses UDP, not TCP. I've implemented a
few systems which speak UDP directly and its very easy. I wouldn't
like to implement TCP though!

--
Nick Craig-Wood <ni**@craig-wood.com> -- http://www.craig-wood.com/nick
Aug 22 '05 #11
yeah, i didn't mean running python on the HC12 but using compiled
python on a ARM7 or simular would be nice. There was a project for
embedded python but it seems to have died. Yeah i've been thinking
about using UDP but then i would have to impliment checksums and having
a reliable way to send and acknowlege the chunks sent. But i'll start
tinkering with it tomorow and se what i'll end up with. I allready have
a tcp-server for the device so it would'nt be to much hassle to modify
it. i'm using OpenTCP by the way.

Aug 22 '05 #12
On Mon, 22 Aug 2005, Grant Edwards wrote:
On 2005-08-22, Magnus Lycka <ly***@carmen.se> wrote:
Hi, I'm working on a project were a need to be able to upload firmware
to a microcontroller based Ethernet device. But because of the memory
constraints the controller can only handle packages of 300 bytes each
time. So therefore the firmware file must be sent in chunks


It's very probable that the TCP stack will combine chunks and
send out full Ethernet frames (4K bytes).


Those are *very* full ethernet frames!

It seems to me that if the receiver can only handle a certain amount of
data at a time, this should be reflected in its receive window; it should
never advertise a bigger window than it can handle. if that's the case,
the program should be able to write data as fast as it likes, as the
sending TCP module will throttle it down so it goes out in right-sized
drips. I'm not a TCP expert, though.

Anyway, if you are going the small-writes route, make sure you set the
TCP_NODELAY flag, to turn of Nagleing on the connection. I'm not sure if
anyone mentioned that already.

tom

--
sh(1) was the first MOO
Aug 22 '05 #13

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: coder_1024 | last post by:
I'm trying to send a packet of binary data to a UDP server. If I send a text string, it works fine. If I attempt to send binary data, it sends a UDP packet with 0 bytes of data (just the...
1
by: Joseph Geretz | last post by:
The sample code from Microsoft contains the following statement: DimeAttachment dimeAttach = new DimeAttachment("image/gif", TypeFormat.MediaType, @"C:\images\test.gif"); In my specific...
8
by: dagecko | last post by:
Hi I would like to know how to detect if a file is binary or not. It's important for me but I don't know where to start. Ty
2
by: Andy | last post by:
Hi there, How do I send binary files to a web service from VBScript? I read a file, converted it into a stream and submitted using xmlhttp.send (post method). objXmlhttp.send...
10
by: joelagnel | last post by:
hi friends, i've been having this confusion for about a year, i want to know the exact difference between text and binary files. using the fwrite function in c, i wrote 2 bytes of integers in...
9
by: thorley | last post by:
Greetings, since there was no reponse to my previous post about an existing FastCGI server in python, I've taken to writing my own. (which of course I'll share--*if* there's something to share ;) ...
4
by: David Hirschfield | last post by:
I have a pair of programs which trade python data back and forth by pickling up lists of objects on one side (using pickle.HIGHEST_PROTOCOL), and sending that data over a TCP socket connection to...
19
by: sagar45 | last post by:
Does anyone have C# code for interface between xbee and meridian p micro controller development board?
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.