Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
利用C++串口通信实现浮点发送与接收_C++_C_Raspberry Pi3_Serial Communication_Wiringpi - Fatal编程技术网

利用C++串口通信实现浮点发送与接收

利用C++串口通信实现浮点发送与接收,c++,c,raspberry-pi3,serial-communication,wiringpi,C++,C,Raspberry Pi3,Serial Communication,Wiringpi,在Raspberrypi上使用WiringPi库进行串行通信 函数serialPutcharint fd、unsigned char c和serialGetchar int fd可以很好地发送和接收整数值 但不显示浮点 发送方 int main () { int fd ; int count ; float val; if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) < 0) { fprintf (stderr, "Unable to open s

在Raspberrypi上使用WiringPi库进行串行通信 函数serialPutcharint fd、unsigned char c和serialGetchar int fd可以很好地发送和接收整数值 但不显示浮点

发送方

int main ()
{
int fd ;
int count ;
float val;

if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) < 0)
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror 
(errno)) ;
return 1 ;
}

if (wiringPiSetup () == -1)
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror 
(errno)) ;
return 1 ;
}
for (count = 0 ; count < 256 ; ){
val=4.1;
fflush (stdout) ;
serialPutchar(fd,val);
++count ;
delay (500) ;
}
printf ("\n");
return 0;}
接收端

 int main ()
 {
 int fd ;

 if ((fd = serialOpen ("/dev/ttyUSB0", 9600)) < 0)
 {
fprintf (stderr, "Unable to open serial device: %s\n", strerror 
(errno)) ;
return 1 ;
}
if (wiringPiSetup () == -1)
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror 
(errno)) ;
return 1 ;
}
while(true)

{

  printf ("%f", serialGetchar (fd)) ;
  fflush (stdout) ;
  printf ("\n") ;
}

return 0 ;
}
我预计输出为4.100000,但实际输出为0.000000

任何发送和接收浮点数的帮助都将不胜感激
提前感谢

您需要做的是将浮点值分解为字节,然后逐个发送/接收它们。 注意:以下代码假定发送方和接收方使用相同的endian系统


您需要做的是将浮点值分解为字节,然后逐个发送/接收它们。 注意:以下代码假定发送方和接收方使用相同的endian系统

float需要以多个字节的形式发送数据,而不仅仅是一个只发送1个字节的serialPutchar调用

当通过串行通道接收多个字节时,一个字节很容易被丢弃,或者接收机很容易在中流开始接收。我建议使用框架数据,以某种方式处理

示例:使用Sentinel作为文本发送

// Sender
char buf[30];
snprintf(buf, sizeof buf, "<%a>", some_float);
serialPutString(fd, buf);

// Receive
while (serialGerChar(fd) != '<') {
  ;
}
char buf[30*2];
for (i=0; i<sizeof buf - 1; i++) {
  buf[i] = serialGetChar(fd);
  if (buf[i] == '>') {
    break;
  }
}
buf[i] = '\0';
f = strtod(buf, &endptr);
// additional checks possible here.
健壮的代码不会假设传入的数据格式正确,并检查各种问题,如不完整、过多、非数字文本。

浮点需要以多个字节的形式发送数据,而不仅仅是一次调用serialPutchar(只发送1个字节)

当通过串行通道接收多个字节时,一个字节很容易被丢弃,或者接收机很容易在中流开始接收。我建议使用框架数据,以某种方式处理

示例:使用Sentinel作为文本发送

// Sender
char buf[30];
snprintf(buf, sizeof buf, "<%a>", some_float);
serialPutString(fd, buf);

// Receive
while (serialGerChar(fd) != '<') {
  ;
}
char buf[30*2];
for (i=0; i<sizeof buf - 1; i++) {
  buf[i] = serialGetChar(fd);
  if (buf[i] == '>') {
    break;
  }
}
buf[i] = '\0';
f = strtod(buf, &endptr);
// additional checks possible here.

稳健代码不假定输入数据是良好的,检查各种问题,如不完整的、过多的、非数字的文本。< /P>如果您想要C++中的解决方案,那么请不要添加C标记。C和C++是两种非常不同的语言,它们有不同的规则和语义和构造。这样说,你所显示的代码可以是纯C,代码中没有任何东西需要C++编译器。如果你只打印一个字符,我更喜欢PtChar’n’,而不是Primtf\n;结果是一样的,放置前者效率更高。为什么一个字符是4.1??您需要在发送端将浮点转换为字节数组,然后发送,然后在接收端执行相反的过程。如果将浮点分配给无符号字符,您认为会发生什么情况?那么serialGetchar的返回类型是什么?非常确定它是无符号字符。使用%f格式说明符打印这样的内容会调用未定义的行为。所以任何事情都有可能发生。。。你需要投双倍的,而不是之前!为了避免UB,传输仍然无法工作…如果你想要C++中的解决方案,那么请不要添加C标签。C和C++是两种非常不同的语言,它们有不同的规则和语义和构造。这样说,你所显示的代码可以是纯C,代码中没有任何东西需要C++编译器。如果你只打印一个字符,我更喜欢PtChar’n’,而不是Primtf\n;结果是一样的,放置前者效率更高。为什么一个字符是4.1??您需要在发送端将浮点转换为字节数组,然后发送,然后在接收端执行相反的过程。如果将浮点分配给无符号字符,您认为会发生什么情况?那么serialGetchar的返回类型是什么?非常确定它是无符号字符。使用%f格式说明符打印这样的内容会调用未定义的行为。所以任何事情都有可能发生。。。你需要投双倍的,而不是之前!为了避免UB,传输仍然无法工作……除了大小之外,两端也必须使用相同的二进制表示。很可能两者都使用IEEE754,但这在任何地方都不是强制要求的。请注意,通常情况下,整数的endian不需要与float的endian匹配。然而,如果发送方/接收方是匹配的系统,endian和FP格式是可以忽略的。除了大小之外,两端必须使用相同的二进制表示。很可能两者都使用IEEE754,但这在任何地方都不是强制要求的。请注意,通常情况下,整数的endian不需要与float的endian匹配。然而,如果发送方/接收方是匹配的系统,endian和FP格式是不可忽略的问题。使用%a有一个缺点。序列化浮点数的最佳简单方法。使用%a只需一个gummi点。序列化浮动的最佳简单方法。