将串行输入 1:1 保存到 python

save serial input 1:1 in python

我对 python 很陌生,所以我有几个问题。 我有一个带有 sd 卡接口的 arduino,它存储一个包含一些数据的二进制文件。我们称它为 SAFEFILE.BIN。 我想做的主要事情是,通过串口发送数据并在我的电脑上用 python 程序创建一个 1:1 副本以供进一步操作。

这是我用来将 Arduino 的串行输出写入文件的部分(串行端口已打开并正在发送数据):

f = open('SAFEFILE.BIN, 'w+')
while aux != b'':
      aux = ser.readline()
      f.write(aux)
else:
      print('Copy of SAFEFILE.BIN succesfully created')
      f.close()

Arduino代码就是:

File dataFile = SD.open(datafile);
if (dataFile) {
  while (dataFile.available()) {
    Serial.write(dataFile.read());}

目前一切正常。文件中充满了我的数据。但是细看之后我提到了一些问题。我通过使用 hex Editor

读取 hex 信息来比较这两个文件(arduino 上的原始文件和它的副本)

Original file

Saved file

如您所见,write() 或读取过程似乎将“0A”解释为换行符并在其前面添加回车符“0D”。在我的例子中,0A 仅表示 10。 有没有办法停止 python 添加一些我不需要的字节?我想要做的就是在不进行任何解释或编辑的情况下按字节保存串行输入字节。

我尝试用各种格式对读取操作进行解码和编码,到目前为止没有成功。

对于接下来的步骤,我需要这个安全文件是绝对正确的,给我两个选择:

  1. 正在努力使保存过程正确
  2. 在存档中搜索“0D 0A”的字节组合并替换为0A

我肯定更喜欢选项 1!这里有没有人可以帮助我?

在 arduino 中,您使用 Serial.write() 发送信息,它只是发送数据包,没有行尾。然后,您正在阅读 pythons serial.readline(),它接受输入流并查找行尾并将其拆分到那里。如果您不想有任何行结尾和原始数据,请使用 python 的 serial.read(bytes),当您不提供字节数时,它将以非阻塞模式连续读取。 pythons 系列的文档在这里:https://pythonhosted.org/pyserial/shortintro.html#readline 所以你的代码看起来像:

f = open('SAFEFILE.BIN, 'wb')
while aux != b'':
    aux = ser.read()
      f.write(bytearray(aux))
else:
    print('Copy of SAFEFILE.BIN succesfully created')
    f.close()