通过串行连接C和x2B发送结构+; 我在C++中,在我的Linux机器(X64)和一个微控制器(ARDUINO UNO)之间,通过串行连接交换结构。目前结构基本上如下所示 struct __attribute__ ((packed)) packet { uint8_t data[12]; }
对于小于32的数字,可以在微控制器上发送和读取,但较大的数字不相同。像32,变成96,33变成97等等通过串行连接C和x2B发送结构+; 我在C++中,在我的Linux机器(X64)和一个微控制器(ARDUINO UNO)之间,通过串行连接交换结构。目前结构基本上如下所示 struct __attribute__ ((packed)) packet { uint8_t data[12]; },c++,c,linux,serial-port,C++,C,Linux,Serial Port,对于小于32的数字,可以在微控制器上发送和读取,但较大的数字不相同。像32,变成96,33变成97等等 packet my_packet; for (int i = 0; i < 12; ++i) { my_packet.data[i] = i; } if(write(fd, &my_packet, sizeof(packet))>0) { printf("received:\n"); } else { printf("Error writing\
packet my_packet;
for (int i = 0; i < 12; ++i)
{
my_packet.data[i] = i;
}
if(write(fd, &my_packet, sizeof(packet))>0)
{
printf("received:\n");
}
else
{
printf("Error writing\n");
}
包我的包;
对于(int i=0;i<12;++i)
{
my_packet.data[i]=i;
}
if(写入(fd,&my_数据包,sizeof(数据包))>0)
{
printf(“已收到:\n”);
}
其他的
{
printf(“写入错误”);
}
在阅读方面
int ret = read(fd, &my_packet_rev, sizeof(my_packet_rev));
if( ret < 0)
{
printf("Error reading\n");
exit(0);
}
else if (ret == 0 )
{
printf("No response\n");
}
else
{
printf("received:\n");
for (int i = 0; i < 12; ++i)
{
printf("%02X, ", my_packet_rev.data[i]);
}
printf("\n");
}
int-ret=read(fd,&my_-packet_rev,sizeof(my_-packet_rev));
如果(ret<0)
{
printf(“错误读取\n”);
出口(0);
}
else if(ret==0)
{
printf(“无响应”);
}
其他的
{
printf(“已收到:\n”);
对于(int i=0;i<12;++i)
{
printf(“%02X”,我的数据包修订数据[i]);
}
printf(“\n”);
}
输入:
1E
1F
20
21
22
23
24
25
26
27
28
二十九
输出:
1E
1F
60
61
62
63
64
65
66
67
68
六十九
我可能做错了什么?听起来你需要处理Endian。你可以使用
htonl()
/ntohl()
函数来处理。虽然对进行一些研究总是很好的,但这应该不是问题,因为你只是发送一个字节数组。如果my_packet
是packet
结构的一个实例,那么发送是正常的。这只会让接收成为一个可能的问题,或者你如何显示你收到的数据,但不幸的是你没有显示你是如何做到这一点的。请尝试创建一个并向我们显示以下代码:for(int i=0;i<12;++i){my_packet.data[i]=i;
将生成包含以下内容的数组:0x00 0x01 0x02 0x03 0x04…0x0A 0x0B
,该数组与您发布的数据完全不同。请确保双方的通信端口设置相同,例如8N1。发送和接收的数据之间似乎正好短1位。