- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我一直在研究Python代码,该代码将通过WiFi刷新我的Arduino,而我几乎可以将它如此接近地工作。
问题是它是为Python 2创建的,我希望它在最新的python 3上运行。我在套接字发送或接收字符串的地方添加了.encode和解码。直到停止读取字符串并想要读取十六进制字符串为止,它的效果都很好。我得到这个错误
Traceback (most recent call last): File "C:\Users\edwin\Desktop\FlashTesting\pythonFlash.py", line 258, in main() File "C:\Users\edwin\Desktop\FlashTesting\pythonFlash.py", line 250, in main if wait_for (cli, "\x00", MAX_TIMEOUT) [0]: File "C:\Users\edwin\Desktop\FlashTesting\pythonFlash.py", line 123, in wait_for received += cli.recv(1).decode() # .decode() is new TypeError: Can't convert 'bytes' object to str implicitly UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position 0: unexpected end of data.
import sys
import binascii
import struct
import select
import socket
import errno
MAX_TIMEOUT = 500
SUCCESS = "success"
FAILED = "failed"
PORT = 50000
#-------------------------------------------------------------------------------------------------
'''
Class containing the data from non-contiguous memory allocations
'''
class Data :
def __init__ (self, begin, data):
self.begin = begin
self.data = data
self.count = len (data)
#-------------------------------------------------------------------------------------------------
'''
Parameters:
line: The line to parse
Returns:
The size of data. The address of data. The type of data. The line checksum. True if the checksum is correct, otherwise False.
Description:
It parses a line from the .hex file.
'''
def parse_line (line):
ok = False
size = int (line [ 1 : 3 ], 16)
address = int (line [ 3 : 7 ], 16)
type = int (line [ 7 : 9 ], 16)
next_index = (9 + size * 2)
data = binascii.a2b_hex (line [9: next_index])
checksum = int (line [ next_index :], 16)
#checking if checksum is correct
sum = size + (address >> 8) + (address & 0xFF) + type
for byte in data:
sum += byte # was ord(byte) removed to fix TypeError
if ( ~ (sum & 0xFF) + 1) & 0xFF == checksum:
ok = True
return (size, address, type, data, checksum, ok)
#-------------------------------------------------------------------------------------------------
'''
Parameters:
chunks: An array with different chunks of data.
path: The path to the .hex file to read
Returns:
True if the reading was successfully, otherwise False.
Description:
It reads a .hex file and stores the data in memory.
'''
def read_hex_file(chunks, path):
try:
file = open (path, 'r')
except IOError:
print ("Hex file not loaded")
return False
line = file.readline()
if line [0] != ':':
print ("The file seems to be a not valid .hex file")
file.close ()
return False
size, address, type, data, checksum, ok = parse_line(line.strip())
if not ok:
print ("The checksum in line 1 is wrong")
file.close()
return False
chunks.append(Data(address, data))
# Read the other lines
index = 0
count = 2
for line in file:
size, address, type, data, checksum, ok = parse_line(line.strip())
if not ok:
print ("The checksum in line", count, "is wrong")
file.close()
return False
if chunks [index].begin + chunks[index].count == address:
chunks [index].count += size
for code in data:
chunks [index].data += bytes(code) # added bytes to fix TypeError
else:
chunks.append(Data(address, data))
index += 1
count += 1
return True
#-------------------------------------------------------------------------------------------------
'''
Parameters:
None
Returns:
The server socket
Description:
It opens a server socket at the specified port and listens to connections.
'''
def init_server():
server = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
server.bind (('', PORT))
server.listen (1)
return server
#-------------------------------------------------------------------------------------------------
'''
Parameters:
cli: The client socket
response: The search string
timeout: The maximum time in milliseconds the function can be running before a time out.
Returns:
True if the string was found, otherwise False. The received string.
Description:
It waits for the expected string.
'''
def wait_for(cli, response, timeout):
inputs = [cli]
received = ""
milliseconds = 0
while milliseconds < timeout:
rlist, wlist, xlist = select.select(inputs,[], [], 0.001)
if len (rlist) > 0:
received += cli.recv(1).decode() # .decode() is new fixed TypeError
if response in received:
return True, received
milliseconds += 1
return False, received
#-------------------------------------------------------------------------------------------------
'''
Parameters:
cli: The client socket
timeout: The maximum time in milliseconds the function can be running before a time out.
length: The number of bytes to receive.
Returns:
True if the string has the required length, otherwise False. The received string.
Description:
It waits for the required length of bytes.
'''
def return_data(cli, timeout, length = 1):
inputs = [cli]
received = ""
milliseconds = 0
while milliseconds < timeout:
rlist, wlist, xlist = select.select(inputs,[], [], 0.001)
if len (rlist) > 0:
received = cli.recv(length).decode() # .decode() is new
return True, received
milliseconds += 1
return False, received
#-------------------------------------------------------------------------------------------------
'''
Parameters:
cli: The client socket
Returns:
True if the string was found, otherwise False
Description:
It waits for the acknowledge string.
'''
def acknowledge(cli):
if wait_for (cli, "\x14\x10", MAX_TIMEOUT) [0]: #STK_INSYNC, STK_OK
print (SUCCESS)
return True
else:
print (FAILED)
return False
#-------------------------------------------------------------------------------------------------
'''
Parameters:
chunks: An array with different chunks of data.
cli: The client socket
Returns:
Nothing
Description:
It starts the STK500 protocol to program the data at their respective memory address.
'''
def program_process(chunks, cli): # I HAVE ADDED .encode() to any strings inside cli.send IDK if they are correct ? the code has not got to this part yet....
print ("Connection to Arduino bootloader:"),
counter = 0
cli.send(("\x30\x20").encode()) #STK_GET_SYNCH, SYNC_CRC_EOP
if not acknowledge(cli):
return
print ("Enter in programming mode:"),
cli.send (("\x50\x20").encode()) #STK_ENTER_PROGMODE, SYNC_CRC_EOP
if not acknowledge(cli):
return
print ("Read device signature:"),
cli.send(("\x75\x20").encode()) #STK_READ_SIGN, SYNC_CRC_EOP
if wait_for (cli, "\x14", MAX_TIMEOUT) [0]: #STK_INSYNC
ok ,received = return_data (cli, MAX_TIMEOUT, 3)
print (binascii.b2a_hex (received))
if not wait_for (cli, "\x10", MAX_TIMEOUT) [0]: #STK_INSYNC
print (FAILED)
return
else:
print (FAILED)
return
for chunk in chunks:
total = chunk.count
if total > 0: #avoid the last block (the last line of .hex file)
current_page = chunk.begin
pages = total / 0x80
index = 0
for page in range (pages):
print ("Load memory address", current_page , ":"),
cli.send (struct.pack ((("<BHB").encode()), 0x55, current_page , 0x20)) #STK_LOAD_ADDRESS, address, SYNC_CRC_EOP
if not acknowledge (cli):
return
print ("Program memory address:"),
cli.send ((("\x64\x00\x80\x46").encode()) + chunk.data [index:index + 0x80] + (("\x20").encode())) #STK_PROGRAM_PAGE, page size, flash memory, data, SYNC_CRC_EOP
if not acknowledge (cli):
return
current_page += 0x40
total -= 0x80
index += 0x80
if total > 0:
print ("Load memory address", current_page , ":"),
cli.send (struct.pack ((("<BHB").encode()), 0x55, current_page, 0x20)) #STK_LOAD_ADDRESS, address, SYNC_CRC_EOP
if not acknowledge (cli):
return
print ("Program memory address:"),
cli.send (struct.pack(((">BHB").encode()), 0x64, total, 0x20) + chunk.data [index:index + total] + (("\x20").encode())) #STK_PROGRAM_PAGE, page size, flash memory, data, SYNC_CRC_EOP
if not acknowledge (cli):
return
print ("Leave programming mode:"),
cli.send (("\x51\x20").encode()) #STK_LEAVE_PROGMODE, SYNC_CRC_EOP
acknowledge (cli)
#-------------------------------------------------------------------------------------------------
def main():
print ("Arduino program via ESP V1.1")
print ("Listen to connections")
ser = init_server()
inputs = [ser]
while True:
rlist, wlist, xlist = select.select(inputs,[],[])
for s in rlist:
if s == ser:
cli, addr = s.accept()
print (addr[0], "connected")
# It assures the connection is for programming an Arduino and not other service.
if wait_for (cli, "hello", 20000) [0]:
cli.send(("welcome").encode()) # encode(0 is new
ok, received = wait_for(cli, "hex", 10000)
if ok:
chunks = []
print ("Read hex file", received.strip()) # prints out Read hex file Blink.ino.hex
if read_hex_file(chunks, received.strip()):
cli.send (("ok").encode()) # encode(0 is new
print ("listening for blank Serial")
# Wait for the byte '0' sent by Arduino after resetting
if wait_for (cli, "\x00", MAX_TIMEOUT) [0]: # CODE CURRENTLY STOPS HERE DUE TO UNICODE DECODE ERROR
program_process (chunks, cli)
else:
cli.send(("error").encode()) # encode(0 is new
cli.close()
print ("Listen to connections")
#-------------------------------------------------------------------------------------------------
if __name__ == "__main__":
main()
最佳答案
正如bjorn所暗示的那样,您不能(总是)按字节解码UTF-8字符串,仅仅是因为一个字符可以由多个字节组成。因此,您可以做的是组装字符串,直到(希望)包含完整的UTF-8序列,然后再对其进行解码。
def wait_for(cli, response, timeout):
inputs = [cli]
response = response.encode() # Make bytes!
received = b"" # Make bytes!
milliseconds = 0
while milliseconds < timeout:
rlist, wlist, xlist = select.select(inputs, [], [], 0.001)
if len(rlist) > 0:
received += cli.recv(1) # Do not decode yet!
if response in received:
return True, received.decode() # .decode() is new fixed TypeError
milliseconds += 1
return False, received.decode() # .decode() is new fixed TypeError
关于python - 从python 2到3的UnicodeDecodeError,带有.decode()和套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48043848/
我有一个文本文件,发布者(美国证券交易委员会)声称该文件以 UTF-8 编码(https://www.sec.gov/files/aqfs.pdf,第 4 节)。我正在使用以下代码处理这些行: def
在 django 界面中添加元素时遇到问题。我有两个定义: # -*- coding: utf-8 -*- class VisitType(models.Model): name=models
我尝试制作一个脚本来使用 Mechanize 发布表单 剧本: # Browser br = mechanize.Browser() cj = cookielib.LWPCookieJar() br.
我收到此错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range
我正在尝试使用 Google 语音 API 在 Python 中制作语音识别器。我一直在使用和改编 here 中的代码(转换为Python3)。我在计算机上使用一个音频文件,该文件已使用在线转换器从
打开一个docker实例(例如docker run -ti ubuntu:16.04),创建Python文件a.py # -*- coding: utf-8 -*- a = 'ö' 和r.py wit
当我将应用程序与Buildozer for Android打包在一起时,我会收到UnicodeDecodeError。 Log2与Buildozer一起附加 build.py 。 作业系统:UBUNT
我在 Ubuntu 终端(编码设置为 utf-8)中运行此代码段两次,一次使用 ./test.py然后用 ./test.py >out.txt : uni = u"\u001A\u0BC3\u1451
我正在尝试使用 Python 中的以下命令序列替换 Word 文件中的子字符串。代码本身工作得很好 - 即使使用完全相同的 Word 文件,但当将其嵌入到更大规模的项目结构中时,它会在确切的位置抛出错
我在 tox 中有以下配置: [tox] envlist = py37 [testenv] passenv = TRAVIS TRAVIS_* setenv = DEFAULT_FROM =
我正在获取 UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 104: ordinal not in range
在执行子字符串匹配时,我收到 UnicodeDecodeError: 'ascii' codec can't Decode byte 0xc3 inposition 8: ordinal not in
我正在使用 Python 和 lxml,但遇到错误 我的代码 >>>import urllib >>>from lxml import html >>>response = urllib.urlope
我是 python 的新手,我正在尝试处理一小部分 Yelp!数据集是 JSON,但我使用 pandas 库和 NLTK 转换为 CSV。 在对数据进行预处理时,我首先尝试删除所有标点符号以及最常见的
我想不出如何一劳永逸地解决这些问题。当我尝试写“è”(我是意大利人)时,我第一次遇到这些问题。经过一些研究,我发现在最开始添加“#coding: utf-8”似乎可以解决问题....直到现在。 我编辑
我的数据存储包含值,我希望我的表单能够更新这些值。我在 jinja2 中使用 wtforms 和谷歌应用引擎。我收到一条我无法理解的错误消息: 'ascii' codec can't decode b
我们遇到了一个问题(描述为 http://wiki.python.org/moin/UnicodeDecodeError)——请阅读第二段“...自相矛盾...”。 具体来说,我们正在尝试将字符串向上
我正在尝试标记一些文档,但我遇到了这个错误 UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 6: ordina
我想在一个文件中存储一个包含多个 numpy 数组的 Python 对象。我找到了 pickle,但在加载存储的对象时总是遇到 UnicodeDecodeError: Traceback (mos
我正在尝试制作一个 python 脚本来查找 USB 闪存驱动器中的重复文件。 我遵循的过程是创建一个文件名列表,散列每个文件,然后创建一个逆向字典。然而,在过程中的某个地方,我得到了一个 Unico
我是一名优秀的程序员,十分优秀!