Как отправить последовательные данные с клиента сокета Matlab на сервер сокета C? - PullRequest
0 голосов
/ 14 октября 2019

Я работаю с RedPitaya Development Board, который работает под управлением Linux. Приложению требуется связь между сервером сокетов, работающим на плате, и удаленным клиентом, работающим на Matlab. Код сервера C, который я использую, проверен для работы с клиентом Python, поэтому я пытаюсь воссоздать этот клиент Python с моими собственными изменениями, чтобы он соответствовал моим потребностям.

Япередавая четыре числа в качестве данных, но только одно делает их на сервер.

Система работает с числами в формате uint32, каждый байт имеет различное значение для системы, я попытался изменить тип данных, чтобыКлиенты Matlab отправляют, изменяют, если операция является синхронизированной или асинхронной, отправляют ее в виде строки, но только первые отправленные данные отображаются для получения ответа от сервера

Это часть сервера C, которая получает данные:

 if(bind(sock_server, (struct sockaddr *)&addr, sizeof(addr)) < 0)
 {
   perror("bind");
   return EXIT_FAILURE;
 }
 listen(sock_server, 1024);
 printf("Listening on port serverPort ...\n");

 while(1)
{

if((sock_client = accept(sock_server, NULL, NULL)) < 0)
{
  perror("accept");
  return EXIT_FAILURE;
}
while(1) //MSG_WAITALL
{
  //sleep(1);
  rx = recv(sock_client, (char *)&command, 4, MSG_DONTWAIT);
  if (rx == 0) {
     break;
     measuring = 0;
  }
  if(rx > 0) {
     value = command & 0xfffffff;
     switch(command >> 28)
     {
       case 1: /* Trigger Delay - Timing */
            timing = command & 0xff;
                            printf("timing: %zu \n",timing);
            break;

       case 2: /* NSAMPLES */
            if ((command & 0xff) < 10)
                nsamples = (command & 0xff);
            else
            nsamples = 10;
                            printf("samples: %zu \n",nsamples);
            break;

       case 3: /* NAVERAGES */
            naverages = command & 0xff;
                            printf("averages: %zu \n",naverages);
            break;

       case 0: /* fire */

            // set trigger and NSAMPLES set NAVERAGES and stop measurement
            *((int32_t *)(cfg + 0)) = (STOP) + (timing<<8) + (nsamples<<16) + (naverages<<24);

            //sleep(0.1); // wait 0.1 second

            time_begin = clock();
            // start measurement
            *((int32_t *)(cfg + 0)) ^= 1;
            measuring = 1;
            break;
     }
  }

Клиент Python отправляет данные следующим образом:

if self.idle: return
self.socket.write(struct.pack('<I', 1<<28 | self.cbTrigger.currentIndex()))
self.socket.write(struct.pack('<I', 2<<28 | self.cbNOS.currentIndex()))
self.socket.write(struct.pack('<I', 3<<28 | self.cbNOA.currentIndex()))

Клиент Matlab довольно прост:

t=tcpip('RedPitayaIP',serverPort,'NetworkRole','client')
pause(1);
fopen(t);

И я отправляю данныетаким образом:

fwrite(t,variable_trigger_or,'uint32')
fwrite(t,variable_samples_or,'uint32')
fwrite(t,variable_average_or,'uint32')

Клиент Python отправляет данные, а клиент дает следующий ответ:

Litening to port serverPort
timing: 16
samples: 10
averages: 0

И клиент Matlab только получает это

Listening to port serverPort
timing: 16

Так что я буду рад, если кто-нибудь сможетЯ понимаю, что происходит, или, если я что-то упускаю, я не новичок в этом, но также не близок к тому, чтобы быть экспертом

...