串行重复数据

时间:2017-06-07 09:38:41

标签: bash serial-port embedded-linux

我在两台计算机之间通过串口发送一些二进制数据。我是这样做的:

接收

cat < /dev/ttyO5 >> $file

发送

cat < $file > /dev/ttyO5

当我检查文件时,有时接收机会在末尾复制文件开头的一些字节。像这样:

ce16 8fa7 bf54 dc6b 238a #Original file
ce16 8fa7 bf54 dc6b 238a ce16 8fa7 #Generated file on receive machine

最后添加的字节数不固定,有时是3个字节,有时是4个....我不知道为什么,我在发送和接收之前刷新内存....

有任何线索吗?

编辑:已解决;需要在端口确认中禁用-echo选项。

3 个答案:

答案 0 :(得分:1)

根据经验,您不得通过未知配置的串行端口复制二进制数据。将数据编码为文本文件(uuencode,base64,引用可打印,实现自己的)或确保串行端口配置为传输8位原始数据。寻找this example以了解它是如何在C代码中实现的。要从shell脚本或CLI操作串行端口配置,可以使用stty命令。重要的是:设置8个数据位,禁用软件控制流程并选择要传输的原始数据。确保在两侧都设置相同的配置。

答案 1 :(得分:0)

将 Lomezno 的解决方案转化为答案:

stty -F <DEVICE> -echo

(其中 <DEVICE> 是串行设备)

答案 2 :(得分:0)

Lomezno 提到不想使用 C。要重置所有端口设置,我使用以下 Python 脚本:

#!/usr/bin/python2.7

import os, time, termios, sys

PORT = sys.argv[1]

# reset the serial port configuration
fd     = os.open(PORT, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
iflag  = termios.IGNBRK
oflag  = 0
cflag  = termios.CS8 | termios.CREAD | termios.CLOCAL
lflag  = 0
speed  = termios.B115200
cc     = termios.tcgetattr(fd)[-1]
attr   = [iflag, oflag, cflag, lflag, speed, speed, cc]
termios.tcsetattr(fd, termios.TCSANOW, attr)
os.close(fd)