从串口读取打印垃圾

时间:2011-05-20 15:53:01

标签: c++ serial-port

我正在尝试在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。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

其他可能性是您一次从多个线程读取串行端口(可能在同一个过程中,可能不是)。专门打开端口以确保不是您的问题。

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

请记住,read的返回值是以字节衡量的,而不是 16位值。如果您正在接收8个字节然后打印8个短路,您会看到这种行为。(但是,“序列”中最后两个值4621 3341的问题无法用这种方式解释。)根据OP的评论,这似乎是问题的确切原因

在任何情况下,这个问题都不会归因于串口配置。

答案 1 :(得分:0)

大声笑我很抱歉,问题的原因在于其他地方,我在做什么

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个值的缓冲区(我猜是从堆栈中)......

感谢您的回答......