簡體   English   中英

使用串行通信發送和接收浮點數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

任何幫助發送和接收浮點數的方法將不勝感激

您需要做的是將浮點數分成多個字節,然后一一發送/接收它們。 注意:以下代碼假定發送方和接收方使用相同的字節序系統。

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM