1

使用 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

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

4

2 回答 2

4

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

//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);
于 2019-08-01T12:28:56.457 回答
0

Afloat需要将数据作为多个字节发送,而不仅仅是一个调用serialPutchar()只发送 1。

当通过串行通道接收多个字节时,很容易丢弃一个字节或让接收器在中途开始。我建议采用构建数据的方式,以某种方式应对。

示例:作为带有标记的文本发送

// 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.

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

于 2019-08-01T13:48:08.113 回答