我想在数据库中存储另一个覆盆子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中存储一个数据?
答案 0 :(得分:0)
您的任务有两种情况:
通过双向链接,可以期望接收方确认数据是否正确 接收。
使用单向链接,无法与提供商对话。 这很常见,例如当数据通过卫星传输到RDS编码器时。
我将描述UECP协议使用的策略,因为它在单向链路上运行良好。
要传输的数据必须编码到帧中,以便进行错误检测。
数据框通常会限制要传输的最大数据长度。
帧的STA和STP必须用商定的分隔符标记,例如
如果要发送的数据包含分隔符字节,则必须在发送之前对其进行转义。 它们必须在收到时也被解码。为此目的,可以使用例如FD字节为转义 并使用以下翻译:
包含在数据帧CRC中,以便您有机会检测到数据已损坏。
每个帧应包含SQC字段,该字段随每个数据包而变化。
通常,值依次为01,02,03 ...,FF,01,02 ......
每个帧以完全相同的内容发送2或3次。 SEQ没有改变。
任何未通过CRC校验或任何其他完整性规则的帧都将被丢弃。
只接受以完全相同的内容收到两次的帧。这包括 SQC编号。
实施并非无足轻重,我留给您。
请注意,即使上面显示的规则也不能防止错误数据。