По приходу пакета я отправлял тестовый пакет, а пришедший копировал в буфер. Наоборот конечно правильней, но работало же. Смысл своевременных отправок в том, чтобы измеренные значения поступали в тот момент когда они соответствуют обстановке, а не когда все поменялось и сообщение фактически устарело. Скажем периодичность в десятки мС при размере в 256 байт устроила бы. Скажем раз в 25 мС.
Раньше отправка стояла там где сейчас Flags.Send_answer = 1;
CODE
void tcp_send_buff (void)
{
unsigned char remip[4] = {192,168,0,1};
switch (tcp_get_state (my_socket))
{
case TCP_STATE_FREE:
case TCP_STATE_CLOSED:
/* Connection idle, send Connect Request. */
tcp_connect (my_socket, remip, PortNumber, 0);
break;
case TCP_STATE_CONNECT:
Flags.Send_answer = 1;
break;
}
}
unsigned short tcp_callback (uint8_t soc, uint8_t evt, uint8_t *buf, uint16_t len)
{
unsigned int i = 0;
/* This function is called by the TCP module on TCP event */
/* Check the Net_Config.h for possible events. */
switch (evt)
{
case TCP_EVT_DATA: //
/* TCP data frame has arrived, data is located at *buf, */
/* data length is len. Allocate buffer to send reply. */
my_socket = soc;
my_len = len;
tcp_send_buff();
for(i = 0; i <= len; i++)
{
my_rx_buff[i] = *buf;
buf++;
}
break;
case TCP_EVT_CONREQ:
/* Remote host is trying to connect to our TCP socket. */
return (1);
case TCP_EVT_ABORT:
break;
case TCP_EVT_CONNECT:
/* Socket is connected to remote peer. */
return (1);
case TCP_EVT_CLOSE:
break;
case TCP_EVT_ACK:
/* Our sent data has been acknowledged by remote peer */
break;
}
return (0);
}
Теперь в основном цикле:
Код
if(Flags.Send_answer)
{
/* We are connected, send command to remote peer. */
my_temp = tcp_check_send (my_socket);
if (my_temp != 0)
{
maxlen = tcp_max_dsize (my_socket);
if(maxlen > 255) maxlen = 255;
sendbuf = tcp_get_buf (maxlen);
memcpy (sendbuf, my_tx_buff, maxlen);
tcp_send (my_socket, sendbuf, maxlen);
}
Flags.Send_answer = 0;
}