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

2024-10-02 04:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python比较陌生,所以有几个问题要问。 我有一个带sd卡接口的arduino,它存储有一些数据的二进制文件。就这么说吧安全文件.BIN. 我想做的主要事情是,通过串行端口发送数据,然后用python程序在我的pc上创建一个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代码只是:

^{pr2}$

目前一切正常。文件里有我的数据。但仔细一看,我提到了一些问题。我用hex编辑器读取hex信息,比较了这两个文件(arduino上的原始文件和它的副本)

Original file

Saved file

如您所见,write()或reading进程似乎将“0A”解释为换行符,并在其前面添加一个carriereturn“0D”。在我的例子中,0A意味着10。 有没有办法阻止python添加一些我不需要的字节?我所要做的就是保存串行输入字节,而不需要任何解释或编辑。在

我尝试用不同的格式对读操作进行解码和编码,到目前为止还没有成功。在

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

  1. 正在尝试正确执行保存过程
  2. 在保存文件中搜索“0D 0A”的字节组合,并将其替换为0A

我当然更喜欢选择1!有人能帮我吗?在


Tags: 文件数据端口字节bin副本发送数据arduino
1条回答
网友
1楼 · 发布于 2024-10-02 04:30:17

在arduino中,使用Serial.write()发送信息,它只发送包,没有行尾。然后使用pythonsserial.readline()进行阅读,pythons接受一个输入流并查找一个行尾并将其拆分。如果您不想有任何行结尾,而只想使用原始数据,那么可以使用python的serial.read(bytes),当您不提供字节数时,它将以非阻塞模式连续读取。Python系列文档: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()

相关问题 更多 >

    热门问题