使用串行通信 C++ 发送和接收浮点数

to transmit and receive floating point using serial communication c++

使用 WiringPi 库在 Raspberrypi 上进行串行通信 函数 serialPutchar(int 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

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

您需要做的是将浮点数分解成字节,然后 send/receive 一个一个地分解它们。 注意:以下代码假定发送方和接收方使用相同的字节序系统。

//Sender
float f = 4.1;
int i = 0;
for (; i < sizeof(float); ++i)
    serialPutchar(fd, ((char*)& f)[i]);


// receiver
float f;
int i = 0;
for (; i < sizeof(float); ++i)
    ((char*)& f)[i]) = serialGetchar(fd);

A float 需要将数据作为多个字节发送,而不是只发送 1.

serialPutchar() 的一次调用

当通过串行通道接收多个字节时,很容易丢失一个字节或接收方从中途开始。我建议以某种方式使用框架数据来应对。

示例:使用标记发送文本

// 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] = '[=10=]';
f = strtod(buf, &endptr);
// additional checks possible here.

健壮的代码不假定传入数据格式正确并检查各种问题,如不完整、过多、非数字文本。