ฉันกำลังทำงานเพื่อการสื่อสารแบบอนุกรมโดยใช้ C ++ ฉันกำลังเรียกคำสั่ง linux ด้วย C ++ พอร์ตหนึ่งที่ฉันใช้ทำงานเป็นเครื่องส่งและอีกส่วนหนึ่งทำงานเป็นเครื่องรับ

นี่คือวิธีการทำงานของเครื่องส่งสัญญาณ

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <fstream>

using namespace std;

ofstream wfile;
char byte[40];
int n=0;

int main()
{
  while(true)
    {
      wfile.open("/dev/ttyUSB1");
      sprintf(byte,"message : %d\n",n);
      wfile << byte;
      wfile.close();
      printf("%s",byte);
      n++;
      sleep(1);
    }
}

และในหน้าต่างเทอร์มินัล ฉันเห็นผลเป็น

message : 0
message : 1
message : 2
message : 3
message : 4
message : 5
message : 6
message : 7
message : 8
message : 9

ในส่วนของผู้รับ สคริปต์ C++ ของฉันเขียนเป็น

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char var[100];
  FILE *fp;
  while(true)
    {
      fp=popen("cat /dev/ttyUSB0","r");
      fgets(var,sizeof(var),fp);
      printf("%s",var);
      pclose(fp);
    }
  return 0;
}

ฉันคาดหวังว่าจะได้ผลลัพธ์แบบเดียวกันที่หน้าต่างเทอร์มินัลของฝั่งผู้รับของฉัน

ฉันเห็นผลบางอย่างเช่น

message : 1
 1
 1
 1
 1
 1
 1
 1
 1
... (repeats about 100 time)

 1
 1
 1
message : 2







...(void for about 100 line)



message : 3






...


message : 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
: 4
...

บางอย่างเช่นนี้ ฉันสมมติว่านี่เป็นปัญหากับบัฟเฟอร์ในพอร์ตอนุกรม ยิ่งกว่านั้น ตัวรับ กำลังแสดงข้อความจากบัฟเฟอร์เก่าซึ่งไม่ได้เริ่มต้นด้วยซ้ำ! มีวิธีแก้ไขตามที่ฉันตั้งใจไว้หรือไม่?

ตอบ

สิ่งที่ต้องแก้ไข

ตรวจสอบค่าส่งคืนของfgets()

ลดความซับซ้อนตามต้องการ

if (fgets(var,sizeof(var),fp)) {
  printf("<%s>\n",var);
} else {
  printf("Nothing this time.\n");
}

GTG