Отправка входного файла из Excel VBA в Raspberry Pi без изменения содержимого - PullRequest
0 голосов
/ 24 августа 2018

Я отправляю текстовый файл из моего Excel на Raspberry Pi, где Pi прочитает этот файл и получит входные данные внутри. Ввод - только одна строка, и это простое число и ничего больше (40,38 и т. Д.)

Когда я запускаю этот макрос, я прекрасно вижу входной файл на моем ПК, но когда я открываю его внутри Pi, он изменяется, например:

Входной файл на моем ПК:

65

Входной файл в Raspberry:

ÿþ6

Как я могу убедиться, что этот номер отправляется Пи, как есть. Или как мне декодировать это так, чтобы мой скрипт на python мог понять. Я не буду использовать десятичные числа с этим числом, и не имеет значения, будет ли оно отправлено в виде строки, поскольку я могу позже разобрать его в своем коде Python.

Ниже мой Макрос Excel

Sub Send()

    Dim sleeptime As String
    sleeptime = InputBox("Duration between each reading in seconds?")

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim Fileout As Object
    Set Fileout = fso.CreateTextFile("C:\Users\xx\Desktop\VBA\input.txt", True, True)
    Fileout.Write sleeptime
    Fileout.Close
    Set fso = Nothing
    Set Fileout = Nothing


    Const cstrSftp As String = """C:\Program Files\PuTTY\pscp.exe"""
    Dim strCommand As String
    Dim pUser As String
    Dim pPass As String
    Dim pHost As String
    Dim pFile As String
    Dim pRemotePath As String

    pUser = "pi" '//user on remote system
    pPass = "xx" '//user's password on remote system
    pHost = "192.168.x.xx" '//ip address of remote system
    pFile = "C:\Users\xx\Desktop\VBA\input.txt" '//file to transfer
    pRemotePath = "/home/pi/Temp_Codes" '//directory where file will be transferred to

    strCommand = cstrSftp & " -sftp -l " & pUser & " -pw " & pPass & _
        " " & pFile & " " & pHost & ":" & pRemotePath
    Debug.Print strCommand
    Shell strCommand, 0 ' vbHide

End Sub

И это строки внутри скрипта моего Raspberry Pi, где я использую этот входной файл. Позже я использую это значение времени сна внутри time.sleep.

with open('input.txt', 'r') as myfile:
    sleeptime = myfile.read()

sleeptime = float(sleeptime.strip())

Вот простой код, который я запускаю для проверки этой кодировки:

#!/usr/bin/env python

import io

with io.open('input.txt', 'r', encoding='utf-8-sig') as myfile:
    sleeptime = myfile.read()

sleeptime = float(sleeptime.strip())

Это ошибка, которую я получаю до сих пор.

pi@raspberrypi:~/Temp_Codes $ python try.py
Traceback (most recent call last):
  File "try.py", line 6, in <module>
    sleeptime = myfile.read()
  File "/usr/lib/python2.7/codecs.py", line 314, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
  File "/usr/lib/python2.7/encodings/utf_8_sig.py", line 66, in _buffer_decode
    return codecs.utf_8_decode(input, errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

1 Ответ

0 голосов
/ 24 августа 2018

Когда Excel / VBA создает файл Unicode через «CreateTextFile», он сохраняет его в кодировке UTF-16. То, что вы видите, это спецификация (метка порядка байтов).

Вы можете изменить

CreateTextFile("C:\Users\xx\Desktop\VBA\input.txt", True, True)

до

CreateTextFile("C:\Users\xx\Desktop\VBA\input.txt", True, False)

Это сохранит как текстовый файл ASCII. Или вы можете внести изменения на стороне Pi / Python, используя

open('input.txt', 'r', encoding='utf-16')
...