【问题标题】:serial aplication writtes "0D" as "0A"串行应用程序将“0D”写入“0A”
【发布时间】:2017-11-13 09:26:42
【问题描述】:

我在 C 上有一个串行应用程序,它接收数据并将其写入二进制文件。问题是所有数据都是相同的,但是当我在发送端有0A 时,我在接收端有0D。我已将串行端口设置为原始模式并使用wb 选项打开文件。任何线索如何避免这种情况?如果需要一些代码,我会发布它。

谢谢

编辑---------- 文件打开:

 FILE *fout;
    fout = fopen(file,"wb");

串行选项:

    options.c_cflag |= (CLOCAL | CREAD);

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    /* To disable software flow control simply mask those bits: */
    options.c_iflag &= ~(IXON | IXOFF | IXANY);
    options.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);

    tcsetattr(fd, TCSANOW, &options);

    success = 1;

    return success;

写在文件上:

fwrite(buffer,1,n,fout);

---------修复----------

设置此选项可解决问题: options.c_oflag &= ~OPOST;

【问题讨论】:

  • 第一步:显示代码(minimal reproducible example的形式)
  • @FelixPalmen 完成
  • @Lomazo 不完整可验证。请发布我们可以编译而无需自己填补空白的代码。
  • @Lomazo 您应该先阅读如何创建minimal reproducible example。这是一些工作要做,但这是在不让人们玩猜谜游戏的情况下获得答案的唯一方法。不要张贴代码墙,将问题简化为展示它的最小代码。
  • 这看起来像一个 CrLf 问题 - 0xa 是行向下(换行)\n 字符。有一些系统,例如 windows,会自动为其添加回车符(Cr,\r),即 0xd

标签: c hexdump


【解决方案1】:

您需要屏蔽 ICRNL 模式,该模式将输入(回车)转换为换行符字符。这是在接收端,而不是在您的程序中。还有一个相应的输出模式可能会在您端设置,但可能性较小。

【讨论】:

  • “还有对应的输出模式”...OCRNL显然。
  • 感谢您的回答。因此,如果我在我的应用程序 options.c_cflag &= ~OCRNL; 上设置它,应该没问题,对吧?
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2016-05-25
  • 2012-02-03
相关资源
最近更新 更多