所以我知道很多人会建议不要这样做,但我想通过TCP / IP将浮动数据发送到运行在SoC上的TCP服务器(Zynq7020,服务器在Arm A9上)。我想在使用UDP之前将其作为一个简单的概念证明,这可能更适合发送原始数据。我无法将浮动转换为客户端的char数组,并在服务器上再次转换回来。虽然我不确定这是最好的方法。
我正在使用WinSocket API,并且正在发送数据(虽然我不确定这是正确还是有效!):
char * sendbuf;
sendbuf = reinterpret_cast<char *>(f);
iResult = send(ConnectSocket, sendbuf, (int) strlen(sendbuf), 0);
基本上这是正确的,如果不使用UDP,通过TCP浮动的最佳方法是什么。我猜解码基本上是逆向工程用于将浮点数发送为char *的方法。
---下面是一个完整的工作示例,通过WinSock将浮点数发送到Zynq ARM cpu LwIP -
主机Windows 7(可能使用htonf,但我在x86上,所以没有端序问题):
int FPGA_Accelerator::sendFloat(float* f) {
char *sendbuf;
int iResult;
char arr[4];
*(float*)arr= *f;
printf("Sending "); printf(arr); printf("\n");
iResult = send(connection, arr, (int) sizeof(arr), 0);
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(connection);
WSACleanup();
return -1;
}
printf("Bytes Sent: %ld\n", iResult);
return 1;
};
Zynq代码。我在recv_callback中调用函数parse_input(p->payload)
void parse_input(char* input){
xil_printf("Input : ");
xil_printf(input);
xil_printf("\n\r");
u32 d = *(u32*)input;
union v{
float f;
u32 u;
};
union v val;
val.u = d;
printf("Value u32 = %i \n\r",val.u);
printf("Value float = %f \n\r",val.f);
}
答案 0 :(得分:1)
你发送的是浮点数或字符串无关紧要。您将数据作为字节数组发送,并在另一侧接收它们并根据需要进行解释。所以在你的情况下,你应该发送一个4字节长的浮点数。你应该发送4个字节作为字节数组,另一方面将它转换为浮点数并使用它。
iResult = send(ConnectSocket, (char*)&f, (int) sizeof(float), 0);
接收方部分:
char *receivebuf;
// read data from socket
float *receivedFloat = (float*)receivebuf;
使用UDP更容易,因为您不必检查已发送数据的连接和成功。您只需发送它而无需连接到服务器。
答案 1 :(得分:0)
这不是TCP与UDP的问题。
首先,要发送单个浮点值,您不要将其重新解释为地址,而是取浮点数的地址
iResult = send(ConnectSocket, &f, (int) sizeof(f), 0);
但是,只有在通信的两端都有相同的架构时,这才有效。
要使其独立于体系结构问题,必须使用一些External Data Representation进行从一个系统到另一个系统的传输。或者,您也可以使用基于文本的协议并将浮点值转换为字符串。
答案 2 :(得分:-1)
这是不正确的。顾名思义,strlen
用于字符串。您需要将缓冲区的实际大小传递给send
。