我有一些来自传感器的数据。数据在signed int的范围内,大约16位。我需要通过蓝牙发送数据。
问题:
数据是-1564,让我们说。蓝牙传输 - ,1,5,6,然后4.这是低效的。我可以稍后在PC上处理数据,我只需要频率上升。
我的想法/解决方案:
将其转换为二进制,然后转换为ASCII输出。我可以稍后在处理中转换ASCII。我在这里有二进制部分(在StackOverflow上找到):
inline void printbincharpad(char c)
{
for (int i = 7; i >= 0; --i)
{
putchar( (c & (1 << i)) ? '1' : '0' );
}
}
这很好地输出二进制。但是让蓝牙传输,比如24,吐出1,1,0,0,然后是0.事实上,慢于2,然后是4。
说我有65062,传输5个字节,从传感器出来。那是二进制的1111111000100110,16个字节。对于ASCII,它是 &amp; (是的,这里的字符集很小,我知道,但它是唯一的)只有2个字节!在HEX中它是FE26,4个字节。节省3比十进制,14对二进制,2对十六进制。好吧,显然,我想要在这里发送ASCII。
我的问题:
那么,如果给定二进制输入,如何转换为ASCII? 我想发送它,ASCII
对冲:
是的,我在MatLab中的编码比C ++更多。这是针对微控制器的。 BAUD是115200.不,我不知道上面的代码是如何工作的,我不知道putchar的文档在哪里找到。如果你知道我需要运行这个库,请告诉我,因为我不知道。
感谢您提供任何帮助或建议,我很感激。
编辑:回应一些评论:它是我正在读取的两个16位寄存器,因此数据丢失是不可能的。
答案 0 :(得分:0)
当您说ASCII时,您的意思是Base 256.您可以搜索从Base 10转换为Base 256的解决方案。
这是一个C程序,它将包含65062(5个字符)的字符串转换为2个字符的字符串:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* inputString="65062";
int input;
char* tmpString;
char* outString;
int Counter;
input = atoi(inputString);
outString= malloc (sizeof(input) + 1);
tmpString = &input;
for (Counter=0; Counter < sizeof(input) ; Counter++) {
outString[Counter] = tmpString[Counter];
}
outString[sizeof(input)] = '\0';
printf ("outString = %s\n", outString);
free(outString);
}
答案 1 :(得分:0)
putchar写入standard output,通常是控制台。
您可以查看cstdio (or stdio.h)库中的其他输出函数。
无论如何,使用putchar()
,这是实现您所要求的一种方式:
void print_bytes (int n)
{
char *p = (char *) &n ;
for (size_t i = 0; i < sizeof (n); ++i) {
putchar (p [i]) ;
}
}
如果您确定只需要整数16位,则可以这样简化:
void print_bytes (int n)
{
char b = n & 0xff ;
char a = (n >> 8) & 0xff ;
putchar (a) ;
putchar (b) ;
}