【发布时间】:2019-12-10 00:53:52
【问题描述】:
使用 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
任何发送和接收浮点数的帮助将不胜感激 提前致谢
【问题讨论】:
-
如果您想要 C++ 中的解决方案,请不要添加 C 标签。 C 和 C++ 是两种非常不同的语言,具有不同的规则、语义和结构。话虽如此,您显示的代码可能是纯 C,代码中没有任何内容需要 C++ 编译器。
-
如果你只打印一个字符,我更喜欢
putchar('\n')而不是printf("\n");结果是一样的,放前者效率更高。 -
为什么一个字符会是4.1??
-
您需要在发送端将浮点数转换为字节数组,然后发送,然后在接收端执行相反的过程。
-
如果将浮点数分配给无符号字符,你认为它会发生什么?那么
serialGetchar的返回类型是什么?很确定它是unsigned char。使用%f格式说明符进行打印会调用未定义的行为。所以任何事情都可能发生......你需要先加倍(不是float)! (只是为了避开UB,传输还是不行……)
标签: c++ c raspberry-pi3 serial-communication wiringpi