我目前正致力于在几个微控制器(Atmega32)之间创建一个I2C网络。首先,我只想尝试在从机和主机之间进行接口。我有一个连接到从站的传感器,它以无符号整数格式给我数据,但数据传输以无符号字符格式发生。
我无法弄清楚如何在无符号字符格式的网络中传输无符号整数格式的数据。
任何形式的帮助都会有所帮助。
答案 0 :(得分:2)
将十进制数除以2,直到它变为0并将每个除数保存在数组&反转数组以获取该十进制数的二进制数。 假设您的十进制数是7。
7/2=3 remainder=1
3/2=1 remainder=1
1/2=0 remainder=1
So array=11100000
After reverse binary is= 00000111
在c中它将是这样的:
int des=7,binary[8],indexNo=0;
while(des!=0)
{
binary[indexNo]=des%2;
des/=2;
indexNo++;
}
now inverse the binary[] or you can directly start indexNo from last index
(Ex: 8)
答案 1 :(得分:0)
我认为你的评论后我现在明白了。你需要的不是二进制到ASCII字符串的转换,而是二进制传输格式。
请注意,这是一个XY问题:要求X,但要求Y。
为此,您只需在每个数据元素之前加上一个类型前缀(byte)。
// This enum must be known to all transmitters and receivers, of course!
typedef enum {
DATA_TYPE_uint16 = 0,
DATA_TYPE_int8,
...
} DataType;
因此,例如,uint16_t被转换为:
uint8_t tx_buffer[MAX_BUFFER_SIZE];
uint16_t internal_var1;
...
tx_buffer[0] = DATA_TYPE_uint16; // type being sent
tx_buffer[1] = (uint8_t)internal_var1; // lower 8 bits
tx_buffer[2] = (uint8_t)(internal_var1>>8); // lower 8 bits
send_i2c(3, tx_buffer);
接收者代码:
uint8_t rx_buffer[MAX_BUFFER_SIZE];
uint16_t internal_var1;
// read the next frame (i2c delimts frames automatically)
receive(MAX_BUFFER_SIZE, rx_buffer); // do not overflow the buffer
switch ( rx_buffer[0] ) {
case DATA_TYPE_uint16:
internal_var1 = (uint16_t)rx_buffer[1] | (uint16_t)rx_buffer[2] << 8;
break;
...
default:
// invalid frame format (error handling!)
}
请注意,数据以little endian(最低字节优先)发送。这是嵌入式编程中的常见做法。它比将每个位打包成一个字节要紧凑得多(即发送得更快),并且更容易和更快地处理任何一方。
您可以将其扩展为任何类型的数据类型。因此,您可以通过打包单个元素将结构作为单个类型发送,就像我为uint16_t所示。不要试图将数据作为二进制字符串传递!这是通信协议中的灾难。
这实际上称为“编组”(序列化结构化数据)。请注意,仅使用便携式操作。
答案 2 :(得分:0)
大多数通信物理层都是面向字节的 - 这不会阻止大型数据结构或类型的传输。
例如,将16位整数拆分并重新组合为字节组件:
word8_msb = (word16 >> 8) ;
word8_lsb = (word16 & 0xFF) ;
word16 = (word8_msb << 8) | word8_lsb) ;
此外,如果两个节点的字节顺序恰好相同,您可以简单地将数据转换为字节数组:
将整数数组作为字节流发送:
uint16_t integer_data[] = { 1u ,2u ,3u ,4u } ;
uint8_t byte_data = (uint8_t*)integer_data ;
size_t data_length_bytes = sizeof(integer_data) * sizeof(*integer_data) ;
for( int i = 0; i < data_length_bytes )
{
send_byte( byte_data[i] ) ;
}
接收整数数组的字节流:
uint16_t integer_data[4] ;
uint8_t byte_data = (uint8_t*)integer_data ;
size_t data_length_bytes = sizeof(integer_data) * sizeof(*integer_data) ;
for( int i = 0; i < data_length_bytes )
{
byte_data[i] = read_byte() ;
}
在大多数情况下,它并不那么简单;至少需要某种协议来指示数据的开始或同步(因此数据没有错位),并且通常在包含数据和元数据的数据包中传输数据以确保可靠数据传输。