【问题标题】:Reading from serial prints garbage从串行打印垃圾中读取
【发布时间】:2011-05-20 15:53:01
【问题描述】:

我正在尝试配置 dsp 和我的计算机之间的串行通信。

dsp 发送一个 16 位计数器的值,每次发送它都会递增。 所以它只是在数......

这是我在电脑上得到的:

3335 3336 3337 3338 36388 46920 16372 46919 3339 3340 3341 3342 36388 46920 16372 46919 3343 3344 4621 3341 36388 46920 ...

所以我们可以看到计数器被突然出现的这 4 个值打断了......

我的程序配置了

fd = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, FNDELAY);
termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B4800);
cfsetospeed(&options, B4800);
options.c_cflag |= (CLOCAL | CREAD | CS8);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag |= (IXON | IXOFF | IXANY);
tcsetattr(fd, TCSANOW, &options);

DSP 发送 4800/8N1。

有什么想法吗?

【问题讨论】:

  • 从 16 位二进制转换为 ASCII 字符串的值在哪里?在他们通过串口之前还是之后?

标签: c++ serial-port


【解决方案1】:

我强烈怀疑这些是由 DSP 发送的,串行端口驱动程序现在调试得很好。

其他可能性是您一次从多个线程读取串行端口(可能在同一个进程中,也可能不是)。以独占方式打开端口以确保这不是您的问题。

或者,您可能正在从串行端口读取预期值,并在程序内部的一些缓冲/排队中添加垃圾。可能您正在获得部分读取(由于接收超时)。

请记住,read 的返回值以 字节 为单位,而不是 16 位值。如果您接收 8 个字节然后打印 8 个短裤,您会看到这种行为。(但是,“序列”中的最后两个值 4621 3341 的问题不能这样解释.) 根据 OP 的 cmets,这似乎是问题的确切原因

在任何情况下,此问题都不是由串行端口配置引起的。

【讨论】:

  • 哦,你已经指出了我的问题...... 4621 3341 的问题可以解释为每个循环都没有完全填满缓冲区。
【解决方案2】:

对不起,问题的原因在别处,我正在做

unsigned short buffer[4];
n = read(..., buffer, ...); // n in bytes !

然后

for (int i = 0; i < n; ++i) 
    dump << buffer[i] << std::endl;  // index in 16-bits !

所以我一直在读取 4 个项目 + 4 个值的缓冲区(我猜是从堆栈中读取的)...

感谢您的回答...

【讨论】:

  • 我应该做些什么来结束这个问题吗?
  • 因为看起来我猜对了,您可以通过单击复选标记的轮廓“接受”我的答案。这让未来的读者知道我的回答能够解决您的问题。您可能还应该更改问题的标题以使其更准确,例如来自串行端口的数据中的额外垃圾字节等。我已经更新了我的答案以突出显示哪个猜测是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2017-07-21
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多