[英]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
任何幫助發送和接收浮點數的方法將不勝感激
您需要做的是將浮點數分成多個字節,然后一一發送/接收它們。 注意:以下代碼假定發送方和接收方使用相同的字節序系統。
//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);
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] = '\0';
f = strtod(buf, &endptr);
// additional checks possible here.
健壯的代碼不會假定傳入的數據格式正確,並會檢查各種問題,例如不完整,過多的非數字文本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.