Development

NAVIGATION
CATEGORIES
REFERRENCE
LINKS
  • sending binary files to a 16 micro controller.

    12 answers - 589 bytes - related search similar search Add To My Delicious Add To My Stumble Upon Add To My Google Mark Add To My Facebook Add To My Digg Add To My Reddit

    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
  • No.1 | | 1294 bytes | |

    johnny.karlsson (AT) gmail (DOT) 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:

    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!')
  • No.2 | | 170 bytes | |

    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.
  • No.3 | | 986 bytes | |

    2005-08-22, johnny.karlsson (AT) gmail (DOT) com <johnny.karlsson (AT) gmail (DOT) comwrote:

    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.
  • No.4 | | 1053 bytes | |

    2005-08-22, Magnus Lycka <lycka (AT) carmen (DOT) sewrote:

    >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.
  • No.5 | | 308 bytes | |

    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. otherwise perhaps i
    could do a socket.close each time, but that's a terrible waste of
    packets.
  • No.6 | | 764 bytes | |

    2005-08-22, johnny.karlsson (AT) gmail (DOT) com <johnny.karlsson (AT) gmail (DOT) comwrote:

    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. 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.
  • No.7 | | 542 bytes | |

    "Grant Edwards" <grante (AT) visi (DOT) comwrote in message news:11gjn8k74pb6uc0 (AT) corp (DOT) 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).
  • No.8 | | 346 bytes | |

    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!
  • No.9 | | 1078 bytes | |

    johnny.karlsson (AT) gmail (DOT) 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
  • No.10 | | 813 bytes | |

    Grant Edwards <grante (AT) visi (DOT) comwrote:
    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 P 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!
  • No.11 | | 565 bytes | |

    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 TCP by the way.
  • No.12 | | 1199 bytes | |

    Mon, 22 Aug 2005, Grant Edwards wrote:

    2005-08-22, Magnus Lycka <lycka (AT) carmen (DOT) sewrote:

    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_NDELAY flag, to turn of Nagleing on the connection. I'm not sure if
    anyone mentioned that already.

    tom

Re: sending binary files to a 16 micro controller.


max 4000 letters.
Your nickname that display:
In order to stop the spam: 2 + 1 =
QUESTION ON "Development"

EMSDN.COM