停止从串行端口(Python/RPi/UART)读取字节
这个问题相当复杂。看起来我有一个简单的双向通信设备,其中读取端是Raspberry pi 3。我正在传送文件。我将一部分一部分地发送(5kb部分)。它看起来像: 1) 发送端发送第一个5kb部分(正好是5136字节,其中前16个字节是ID/SIZE/ADD_INFO/CRC) 2) RPi3读取5136字节,并计算区块的CRC 3) RPi3比较从发送端接收的CRC和由RPi计算的CRC 4a)如果CRC不匹配,则使用带有3状态输出的双总线缓冲门切换从RX到TX线路的I个车道,并在TX线路上设置高状态(我将其保持30ms) 4b)如果CRC匹配,我只需等待下一个文件块 5) 发送侧也切换通道,如果状态为高,则读取我的TX状态/1(当CRC不匹配时)如果状态为低,则发送相同的块(重新传输)/0发送另一个块。(改变状态需要10毫秒) 在示波器上,它看起来像这样(4a): 而这(4b): 在5136块中,有空闲时间计算CRC,然后我们在RPi3端改变状态,如果必须的话,因为CRC不匹配(4a处的红线),并且从发送端读取TX端 好了,下面是一些来自RPi的简化代码:停止从串行端口(Python/RPi/UART)读取字节,python,raspberry-pi,serial-port,communication,pyserial,Python,Raspberry Pi,Serial Port,Communication,Pyserial,这个问题相当复杂。看起来我有一个简单的双向通信设备,其中读取端是Raspberry pi 3。我正在传送文件。我将一部分一部分地发送(5kb部分)。它看起来像: 1) 发送端发送第一个5kb部分(正好是5136字节,其中前16个字节是ID/SIZE/ADD_INFO/CRC) 2) RPi3读取5136字节,并计算区块的CRC 3) RPi3比较从发送端接收的CRC和由RPi计算的CRC 4a)如果CRC不匹配,则使用带有3状态输出的双总线缓冲门切换从RX到TX线路的I个车道,并在TX线路上设置
def recv():
while True:
#Set line to low because I want to read data
GPIO.output(16, GPIO.LOW)
ID = ser.read(4)
SIZE = ser.read(4)
ADD_INFO = ser.read(4)
CRC = ser.read(4)
#get crc from sending side
crc_chunk = int.from_bytes(CRC, byteorder='little')
data = ser.read(5120)
#calculating CRC from chunk
rpiCRC = crcSTM(data)
while True:
<--- here I wait about 20ms to calculate CRC
if rpiCRC != crc_chunk:
#Crc doesn't match I want retransmission
GPIO.output(16, GPIO.HIGH)
<--- keep it HIGH for about 30ms
break
else:
#keep it low because crc match and we are waiting for next chunk
GPIO.output(16, GPIO.HIGH)
break
def recv():
尽管如此:
#将line设置为low,因为我要读取数据
GPIO.输出(16,GPIO.低)
ID=序列读取(4)
尺寸=序列读数(4)
添加信息=序列读取(4)
CRC=序列读取(4)
#从发送端获取crc
crc_chunk=int.from_字节(crc,byteorder='little')
数据=序列读取(5120)
#从块计算CRC
rpiCRC=crcSTM(数据)
尽管如此:
好吧,我要反抗。我在sudo raspi congif
中启用了选项“您希望通过串行方式访问登录shell吗?”。我不知道为什么这会把一切都搞糟,但会禁用它来修复它。这很奇怪,因为我曾经玩过raspberry和serial,如果RPi3是通过uart发送的,或者只是在不换行的情况下读取,都没有问题:)