我在两台计算机之间通过串口发送一些二进制数据。我是这样做的:
接收
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选项。
答案 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)