在python中保存串行输入1:1

时间:2017-03-24 10:29:28

标签: python serialization save pyserial

我对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());}

到目前为止一切正常。该文件正在填满我的数据。但经过仔细观察,我提到了一些问题。我通过使用十六进制编辑器读取十六进制信息来比较两个文件(arduino上的原始文件及其副本)

Original file

Saved file

正如您所看到的,write()或读取过程似乎将“0A”解释为换行符并在其前面添加了一个“0D”。就我而言,0A仅仅意味着10。 有没有办法阻止python添加一些我不需要的字节?我想要做的就是每个字节保存串行输入字节,无需任何解释或编辑。

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

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

  1. 尝试使用正确的存储过程
  2. 在保存文件中搜索“0D 0A”的字节组合并将其替换为0A
  3. 我肯定更喜欢选项1!有没有人可以帮助我?

1 个答案:

答案 0 :(得分:0)

在arduino中,您发送的信息为Serial.write(),只发送数据包,没有行结束。然后你正在阅读pythons serial.readline(),它接受​​一个输入流并查找一行结尾并将其拆分。如果您不希望有任何行结尾和原始数据,请使用python的serial.read(bytes),当您不提供字节数时,它将以非阻塞模式连续读取。关于蟒蛇的文档序列在这里: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()