Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止从串行端口(Python/RPi/UART)读取字节_Python_Raspberry Pi_Serial Port_Communication_Pyserial - Fatal编程技术网

停止从串行端口(Python/RPi/UART)读取字节

停止从串行端口(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线路上设置

这个问题相当复杂。看起来我有一个简单的双向通信设备,其中读取端是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的简化代码:

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发送的,或者只是在不换行的情况下读取,都没有问题:)