从串口发送/接收数据

时间:2016-02-16 14:47:12

标签: python serial-port

我想在数据库中存储另一个覆盆子pi发送给我的数据:

问题是在发送过程中,某些数据会丢失。所以我发送了20次相同的数据,以确保我的rapsberry正确接收数据。但是我想只存储一次我的数据

这是我的发送代码:

import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=.5)

for x in range(0, 20)
    ser.flushInput()
    ser.flushOutput()
    ser.write(' Hello world ! \r\n')
    ser.flush()

这是我的听力代码:

import serial

ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=.5)
data_fresh = " "
data_old = " "

while True:
    if ser.inWaiting() > 0:
        bytesToRead = ser.inWaiting()
        data_fresh = ser.readline()
        print(--- new data ---)
        print(bytesToRead)
    if data_fresh != data_old:
        data_old = data_fresh
        print(data_fresh)
        # Store in db

这里有一个结果:

--- new data ---
8
H▒Hello world !  // The same bug that in my result

--- new data ---
8
Hello world !

--- new data ---
1
--- new data ---
2
--- new data ---
3
--- new data ---
4
--- new data ---
5
--- new data ---
6
--- new data ---
7
--- new data ---
1
...

当你看到新数据被调用但我没有收到任何东西(bytesToRead> 0这很奇怪)...此外,listerner收到的第一个数据已损坏。

我没有使用连续方法进行处理。

任何人都知道如何解决缓冲区问题,而不是发送我的字符串以及如何只在db中存储一个数据?

1 个答案:

答案 0 :(得分:0)

您的任务有两种情况:

  • 双向串行链接
  • 单向串行链接

通过双向链接,可以期望接收方确认数据是否正确 接收。

使用单向链接,无法与提供商对话。 这很常见,例如当数据通过卫星传输到RDS编码器时。

我将描述UECP协议使用的策略,因为它在单向链路上运行良好。

将数据编码到帧

要传输的数据必须编码到帧中,以便进行错误检测。

数据框通常会限制要传输的最大数据长度。

使用框架分隔符

帧的STA和STP必须用商定的分隔符标记,例如

  • STA:FE
  • STP:FF

转发数据中的分隔符

如果要发送的数据包含分隔符字节,则必须在发送之前对其进行转义。 它们必须在收到时也被解码。为此目的,可以使用例如FD字节为转义 并使用以下翻译:

  • FD - > FD 00
  • FE - > FD 01
  • FF - > FD 02

使用纠错码(例如CRC)

包含在数据帧CRC中,以便您有机会检测到数据已损坏。

在帧中包含SQC编号

每个帧应包含SQC字段,该字段随每个数据包而变化。

通常,值依次为01,02,03 ...,FF,01,02 ......

每帧发送2次或3次

每个帧以完全相同的内容发送2或3次。 SEQ没有改变。

扔掉任何东西,什么是不完整的

任何未通过CRC校验或任何其他完整性规则的帧都将被丢弃。

仅接受使用相同内容

两次收到的帧

只接受以完全相同的内容收到两次的帧。这包括 SQC编号。

实施

实施并非无足轻重,我留给您。

请注意,即使上面显示的规则也不能防止错误数据。