使用 C++ 进行串行通信时的缓冲区问题

发布于 2025-01-10 23:27:18 字数 1346 浏览 0 评论 0原文

我正在使用 C++ 进行串行通信。我正在用 C++ 调用 linux 命令。我使用的一个端口用作发射器,另一部分用作接收器。

这就是发送器的工作原理,

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

我看到类似这样的 。我假设这是串行端口缓冲区的问题。此外,接收器正在显示来自甚至尚未初始化的旧缓冲区的消息!有什么办法可以按照我的意愿解决这个问题吗?

I am working on for serial communication using C++. I am calling linux command with C++. One port I am using works as transmitter and the other part is working as a receiver.

This is how transmitter works,

#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);
    }
}

And in the terminal window, I see result as

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

In the receiver part, my C++ script is written as

#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;
}

I am expecting to get same result at the terminal window of my receiver's side.

I see a result something like

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

Something like this. I am assuming this is a problem with the buffer in the serial port. Moreover, Receiver is showing messages from old buffers which is not even initialized! Is there any way to fix this as I intended?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北凤男飞 2025-01-17 23:27:18

需要修复的问题

检查 fgets() 的返回值

根据需要进行简化。

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

GTG

Things to fix

Check return value of fgets()

Simplify as desired.

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

GTG

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文