|
tcp_check_send выдает нулевое значение, Стек Keil 4.72 |
|
|
|
Jul 27 2014, 11:40
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Функция Код tcp_check_send (my_socket) стала возвращать нулевое значение. Из-за этого не происходит передачи. Раньше все работало хорошо. Внесенные изменения коснулись лишь сохранения значений во внешнюю EEPROM. Хочу спросить как можно узнать что повлияло и что вообще может повлиять. Спасибо.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 28 2014, 18:47
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Jul 28 2014, 18:39)  а что tcp_get_state возвращает? Может коннект по какой-то причине закрылся? Пробовал вот так переписывать, но результат тот же: Код void send_data (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: /* We are connected, send command to remote peer. */ if (tcp_check_send (my_socket)) { 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); } break; } } Попадает на ту же функцию и опять передачи нет.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 29 2014, 19:23
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
По приходу пакета я отправлял тестовый пакет, а пришедший копировал в буфер. Наоборот конечно правильней, но работало же. Смысл своевременных отправок в том, чтобы измеренные значения поступали в тот момент когда они соответствуют обстановке, а не когда все поменялось и сообщение фактически устарело. Скажем периодичность в десятки мС при размере в 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; }
Сообщение отредактировал IgorKossak - Jul 30 2014, 08:27
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|