2

I've been trying to modify the tcp server example with LwIP in STM32F4DISCOVERY board. I have to write a sender which does not necessarily have to reply server responses. It can send data with 100 ms frequency, for example.

Firstly, the example of TCP server is like this:

static void tcpecho_thread(void *arg)
{
  struct netconn *conn, *newconn;
  err_t err;

  LWIP_UNUSED_ARG(arg);

  /* Create a new connection identifier. */
  conn = netconn_new(NETCONN_TCP);

  if (conn!=NULL) {  
    /* Bind connection to well known port number 7. */
    err = netconn_bind(conn, NULL, DEST_PORT);

    if (err == ERR_OK) {
      /* Tell connection to go into listening mode. */
      netconn_listen(conn);

      while (1) {
        /* Grab new connection. */
        newconn = netconn_accept(conn);

        /* Process the new connection. */
        if (newconn) {
          struct netbuf *buf;
          void *data;
          u16_t len;

          while ((buf = netconn_recv(newconn)) != NULL) {
            do {
              netbuf_data(buf, &data, &len);

              //Incoming package
              .....

              //Check for data
              if (DATA IS CORRECT) 
              {
                //Reply
                data = "OK";
                len = 2;

                netconn_write(newconn, data, len, NETCONN_COPY);
              }

            } while (netbuf_next(buf) >= 0);

            netbuf_delete(buf);
          }

          /* Close connection and discard connection identifier. */
          netconn_close(newconn);
          netconn_delete(newconn);
        }
      }
    } else {
      printf(" can not bind TCP netconn");
    }
  } else {
    printf("can not create TCP netconn");
  }
}

I modified this code to obtain a client version, this is what I've got so far:

static void tcpecho_thread(void *arg)
{
  struct netconn *xNetConn = NULL;

  struct ip_addr local_ip; 
  struct ip_addr remote_ip; 
  int rc1, rc2; 

  struct netbuf *Gonderilen_Buf = NULL;
  struct netbuf *gonderilen_buf = NULL;
  void *b_data;
  u16_t b_len;

  IP4_ADDR( &local_ip, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3 );  
  IP4_ADDR( &remote_ip, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3 );

  xNetConn = netconn_new ( NETCONN_TCP );  
  rc1 = netconn_bind ( xNetConn, &local_ip, DEST_PORT ); 
  rc2 = netconn_connect ( xNetConn, &remote_ip, DEST_PORT );

  b_data = "+24C"; // Data to be send
  b_len = sizeof ( b_data );  

   while(1)
   {
     if ( rc1 == ERR_OK )
      {
        // If button pressed, send data "+24C" to server
        if (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) == Bit_SET)
        {

          Buf = netbuf_new();
          netbuf_alloc(Buf, 4); // 4 bytes of buffer
          Buf->p->payload = "+24C";
          Buf->p->len = 4;

          netconn_write(xNetConn, Buf->p->payload, b_len, NETCONN_COPY);
          vTaskDelay(100); // To see the result easily in Comm Operator

          netbuf_delete(Buf);
        }
    }
    if ( rc1 != ERR_OK || rc2 != ERR_OK )
    {
      netconn_delete ( xNetConn );
    }
  }
}

While the writing operation works, netconn_write sends what's on its buffer. It doesnt care whether b_data is NULL or not. I've tested it by adding the line b_data = NULL;

So the resulting output in Comm Operator is like this:

Rec:(02:47:27)+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C

However, I want it to work like this:

Rec:(02:47:22)+24C
Rec:(02:47:27)+24C 
Rec:(02:57:12)+24C 
Rec:(02:58:41)+24C

The desired write operation happens when I wait for around 8 seconds before I push the button again.

Since netconn_write function does not allow writing to a buffer, I'm not able to clear it. And netconn_send is only allowed for UDP connections.

I need some guidance to understand the problem and to generate a solution for it. Any help will be greately appreciated.

0

2 Answers 2

1

I see one or two problems in your code, depending on what you want it exactly to do. First of all, you're not sending b_data at all, but a constant string:

b_data = "+24C"; // Data to be send

and then

Buf->p->payload = "+24C";
Buf->p->len = 4;
netconn_write(xNetConn, Buf->p->payload, b_len, NETCONN_COPY);

b_data is not anywhere mentioned there. What is sent is the payload. Try Buf->p->payload = b_data; if it's what you want to achieve.

Second, if you want the +24C text to be sent only once when you push the button, you'll have to have a loop to wait for the button to open again before continuing the loop, or it will send +24C continuously until you stop pushing the button. Something in this direction:

while (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) == Bit_SET) {
  vTaskDelay(1);
}
Sign up to request clarification or add additional context in comments.

Comments

0

It's just a matter of printing the result in the correct way.

You can try to add this part of code before writing in the netbuf data structure:

char buffer[20]; 

sprintf(buffer,"24+ \n");

Buf->p->payload = "+24C";

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.