We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi everyone. I'm trying to synchronize MCU internal clock with NTP server. My code is already running on some older projects. Now I need to migrate my code to RTX environment and BSD sockets.
Below is simplified task created for testing purpuses. I'm using MDK ARM Professional 4.73.
__task void ntp_request_task (void) { SOCKADDR_IN sock_addr; int32_t soc; int32_t res; int32_t slen = sizeof(sock_addr); uint8_t ntp_data[48] = { 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; os_itv_set(3000); while (1) { os_itv_wait(); soc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sock_addr.sin_port = htons(params.Sntp.UdpPort); sock_addr.sin_family = PF_INET; sock_addr.sin_addr.s_b1 = params.Sntp.ip[0]; sock_addr.sin_addr.s_b2 = params.Sntp.ip[1]; sock_addr.sin_addr.s_b3 = params.Sntp.ip[2]; sock_addr.sin_addr.s_b4 = params.Sntp.ip[3]; // prepare_ntp_request(data); if((res = sendto(soc, (const char*) ntp_data, sizeof(ntp_data), 0, (SOCKADDR *) &sock_addr, slen)) == sizeof(ntp_data)) { res = recvfrom (soc, (char *) ntp_data, sizeof (ntp_data), 0, (SOCKADDR *) &sock_addr, &slen); if(res < 0) { printf("recvfrom error code: %d\n", res); } } closesocket(soc); } }
After I send NTP request, I can't read server response. Everything seems OK in Wireshark. Problem is in recvfrom function. Recvfrom function returns error code -2 (SCK_EINVALID). If I use TCP Debug Library, I get following error log.
BSD: Recv/from Socket 1 BSD-ERR: Recv, Socket 1 wrong state