Ich habe versucht, die Signalverarbeitungsparameter per Socket-Kommunikation an RPi zu senden. Als ich den Internet-Code für die erste Socket-Kommunikation kopierte, gab die Accept-Funktion einen Fehler "Ungültiges Argument" aus und funktionierte nicht. Also fand ich heraus, dass accept eine Funktion ist, die verwendet wird, wenn das Protokoll TCP ist, und die Clientseite es per UDP sendet.
Informationen zum Überblick über das UDP-Protokoll und den Servercode finden Sie auf der folgenden Site. UDP verwenden: Geek-Seite Aus der Erläuterung der obigen Site geht hervor, dass UDP gut ist, wenn Unmittelbarkeit erforderlich ist und der Parameter bis zu einem gewissen Grad kurz ist. Daher habe ich beschlossen, den Empfang des Servers in UDP umzuschreiben. Unten ist der Code, der das Signal in der Hauptroutine verarbeitet und die Parameter in einem anderen Thread empfängt. Der Teil, der Audiodaten erfasst, wird weggelassen.
main.c
#include <netinet/in.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#define PORT_NO 12345
/*Struktur zum Speichern von Empfangsparametern*/
typedef struct {
/*Geeigneter Parameter Variablengruppe*/
} socket_data_struct;
int serverSock;
struct sockaddr_in serverAddress;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
/*Socket-Initialisierungsfunktion*/
int socketInit();
/*Eine Funktion für Threads, die Parameter in der Socket-Kommunikation empfangen*/
void* parameterReceive(void* pParam);
int socketInit()
{
serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(serverSocket < 0) {
return -1;
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(PORT_NO);
/*Empfangen Sie Daten, die an alle IP-Adressen adressiert sind*/
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) != 0) {
return -1;
}
return 0;
}
void* parameterReceive(void* pParam)
{
socket_data_struct data;
struct sockaddr_in senderInfo;
socklen_t addressLength;
while (1) {
recvfrom(serverSock, &data, sizeof(socket_data_struct), 0, (struct sockaddr *)&senderInfo, &addressLength);
pthread_mutex_lock(&m);
/*Verarbeitung empfangener Parameter*/
pthread_mutex_unlock(&m);
/*Echo empfangene Daten an Client*/
sendto(serverSocket, (char *)&data, sizeof(socket_data_struct), 0, (struct sockaddr *)&senderInfo, addressLength);
usleep(500);
}
close(serverSocket);
}
int main(void)
{
pthread_t threadIdSocket;
if(socketInit()){
return -1;
}
pthread_mutex_init(&m, NULL);
pthread_create(&threadIdSocket, NULL, parameterReceive, NULL);
while(1){
/*Enthält den DSP-Code*/
}
pthread_join(threadIdSocket, NULL);
pthread_mutex_destroy(&m);
return 0;
}
Als Vorsichtsmaßnahme bei paralleler Signalverarbeitung und Socket-Kommunikation sollten Sie den Socket-Kommunikationsthread nicht vor der Haupt-while-Schleife "pthread_join", sondern "sleep" in die while-Schleife des Socket-Kommunikationsthreads setzen. Geht es um Natürlich muss auch der zu verwendende Port mit ufw oder so geöffnet werden. Sie können jetzt Signalverarbeitungsparameter empfangen, während Sie die Signalverarbeitung durchführen.
Recommended Posts