我有一个外部硬件仪表,可以通过TCP连接将测量的电压值作为浮点值发送。我正在编写一个C代码来捕获此数据。我写的第一个代码如下:
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 5843
int main(int argc, char const *argv[]){
struct sockaddr_in address;
int sock = 0;
int valread;
struct sockaddr_in serv_addr;
//data_points* data = malloc(sizeof(data_points));
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, "130.127.88.141", &serv_addr.sin_addr)<=0){
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
printf("\nConnection Failed \n");
return -1;
}
float data;
valread = read( sock , (void*) &data, sizeof(float));
printf("value: %f\n", data);
return 0;
}
此代码几乎是this geek-to-geek代码的副本。但是当我运行这段代码时,我得到的值如下:
./client
value: -0.000000
这是不可接受的值。因此,为了测试我得到的值,我对数据接收部分进行了如下修改:
unsigned char data[4];
valread = read( sock , (void*) data, sizeof(float));
printf("%d, %d, %d, %d\n", data[0], data[1], data[2], data[3]);
哪些印刷品:
./client
65, 49, 110, 152
我将其手动转换为浮点值,如下所示:
65 = 01000001
49 = 00110001
110 = 01101110
152 = 10011000
将它们串联在一起可以得到:
01000001001100010110111010011000
,当解释为IEEE 754浮点数时,它给出11.0895,这是电表发送的实际值。 为什么我的初始代码没有给出该值?如何转换?任何帮助,将不胜感激。