Go Down

Topic: Ethernetsends a String as one char at the time (Read 1 time) previous topic - next topic

vesal

I must do

String str = "Hello World";
int n = str.length()+1;
char st[n];
str.toCharArray(st,n);
client.print(st);

instead of

client.print(str)

to send s String in on one TCP/IP packet.

The problem is in Print.cpp:

void Print::print(const String &s)
{
for (int i = 0; i < s.length(); i++) {
  write(s);
}
}

and then every write(char)  is send in Client.cpp
as in one TCP/IP packet.  That sinks the transfrer
rate a lot.

It might be idea to do a write(const String &) in Print and
then implement print(const String &) by calling that.

And then in Client one must override write(const String &)
by writing all chars to same packet.

One problem to implement that is that

void String::toCharArray(char *buf, unsigned int bufsize)

and

void String::getBytes(unsigned char *buf, unsigned int bufsize)

are not const methods as they should be.

:-[

well... I guess you're gonna have to read through 5100's manual and create a driver yourself. :\
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

robtillaart


From Ethernet library - Client.cpp

Code: [Select]
void Client::write(uint8_t b) {
 if (_sock != MAX_SOCK_NUM)
   send(_sock, &b, 1);
}

void Client::write(const char *str) {
 if (_sock != MAX_SOCK_NUM)
   send(_sock, (const uint8_t *)str, strlen(str));
}

void Client::write(const uint8_t *buf, size_t size) {
 if (_sock != MAX_SOCK_NUM)
   send(_sock, buf, size);
}

Should be easy ... Try replacing Client.print(str) with Client.write(str), Add a '\n' to the string if using println...

Does this help?
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up