使用串行通信 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.
健壮的代码不假定传入数据格式正确并检查各种问题,如不完整、过多、非数字文本。
使用 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.
健壮的代码不假定传入数据格式正确并检查各种问题,如不完整、过多、非数字文本。