我正在尝试在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。
有什么想法吗?
答案 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个值的缓冲区(我猜是从堆栈中)......
感谢您的回答......