Python 将字符串发送到serial.to_字节无效

Python 将字符串发送到serial.to_字节无效,python,pyserial,Python,Pyserial,我正在尝试发送一个包含命令的字符串变量 像这样: value="[0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]" self.s.write(serial.to_bytes(value)) 上述方法失败了。不会给出任何错误 但当我发送这样的值时,它就起作用了: self.s.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a])) self.s.write(serial.to_bytes(str(valu

我正在尝试发送一个包含命令的字符串变量

像这样:

value="[0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]"
self.s.write(serial.to_bytes(value))
上述方法失败了。不会给出任何错误

但当我发送这样的值时,它就起作用了:

self.s.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]))
self.s.write(serial.to_bytes(str(value)))
我还尝试发送如下字符串:

self.s.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]))
self.s.write(serial.to_bytes(str(value)))
仍然不起作用。有人能告诉我如何通过存储字符串来发送值吗

我想做这件事:

value="[0x"+anotherstring+",0x"+string2+"0x33, 0x0a]"
并发送值

谢谢

将序列作为输入。应删除值周围的双引号以传递整数序列,而不是表示要传递的序列的str:

value = [0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]
self.s.write(serial.to_bytes(value))  # works now
在第一种情况下,您发送了表示[0x31、0x0a、0x32、0x0a、0x33、0x0a]的字节序列。现在,您将按预期发送序列[0x31、0x0a、0x32、0x0a、0x33、0x0a]

如果要发送字符串,只需将其作为字节发送:

对于序列:

for value in values:
    # Python 2
    self.s.write(value)

    # Python 3
    self.s.write(value.encode())
将序列作为输入。应删除值周围的双引号以传递整数序列,而不是表示要传递的序列的str:

value = [0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]
self.s.write(serial.to_bytes(value))  # works now
在第一种情况下,您发送了表示[0x31、0x0a、0x32、0x0a、0x33、0x0a]的字节序列。现在,您将按预期发送序列[0x31、0x0a、0x32、0x0a、0x33、0x0a]

如果要发送字符串,只需将其作为字节发送:

对于序列:

for value in values:
    # Python 2
    self.s.write(value)

    # Python 3
    self.s.write(value.encode())

如果传递整数列表对您有效,那么只需将十六进制表示形式转换为整数并将其放入列表中即可

详细步骤:

打开python解释器

导入SerialPort并打开一个串行端口,称之为ser

复制下面的代码并将其粘贴到python解释器中:

守则:

command = '310a320a330a'
hex_values = ['0x' + command[0:2],  '0x' + command[2:4],
              '0x' + command[4:6],  '0x' + command[6:8],
              '0x' + command[8:10], '0x' + command[10:12]]
int_values = [int(h, base=16) for h in hex_values]
ser.write(serial.to_bytes(int_values))
它将产生与此相同的效果:

ser.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]))

实际上,您可以测试int_values==[0x31,0x0a,0x32,0x0a,0x33,0x0a]是否为真,因此您编写的内容完全相同。

如果传递整数列表对您有效,则只需将十六进制表示转换为整数并将其放入列表中即可

详细步骤:

打开python解释器

导入SerialPort并打开一个串行端口,称之为ser

复制下面的代码并将其粘贴到python解释器中:

守则:

command = '310a320a330a'
hex_values = ['0x' + command[0:2],  '0x' + command[2:4],
              '0x' + command[4:6],  '0x' + command[6:8],
              '0x' + command[8:10], '0x' + command[10:12]]
int_values = [int(h, base=16) for h in hex_values]
ser.write(serial.to_bytes(int_values))
它将产生与此相同的效果:

ser.write(serial.to_bytes([0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a]))


实际上,您可以测试int_values==[0x31,0x0a,0x32,0x0a,0x33,0x0a]是否为真,因此您编写的内容完全相同。

str也是一个序列。。。碰巧的是,用十六进制表示法表示的整数列表与实际列表本身不同……我想像这个值一样连接多个值=[0x+anotherstring+,0x+string2我该怎么做?@JonClements是的,我知道,但在这种情况下,这不是arslion想要的。@Tiger-222如果他们只能以字符串形式接收数据,并且数据不是硬编码的,因此他们可以删除引号,那么我只能猜测OP在ast.literal\u eval之后,否则答案是Lally-不要将其作为字符串发送:因此没有其他方法将字符串附加到序列值?str也是一个序列…正好十六进制表示法的整数列表的表示形式不同于实际列表本身…我想将多个值像此值一样连接起来=[0x+anotherstring+,0x+string2我该怎么做?@JonClements是的,我知道,但在这种情况下,这不是arslion想要的。@Tiger-222如果他们只能以字符串形式接收数据,并且数据不是硬编码的,因此他们可以删除引号,那么我只能猜测OP在ast.literal\u eval之后,否则答案是Lally-不要将其作为字符串发送:因此没有其他方法将字符串附加到序列值?您使用的是Python 2还是Python 3?在Python 3中,请尝试s.WriteHello发送字节序列而不是unicode字符串。@Dietrich我使用的是2.7您使用的是Python 2还是Python 3?在Python 3中,请尝试s.WriteHello发送字节序列而不是字符串n unicode字符串。@Dietrich我使用的是2.7I,我将310a320a330a十六进制数据从使用“十六进制”编码的字符串转换而来,我想将十六进制数据转换为:[0x31,0x0a,0x32,0x0a,0x33,0x0a]然后将它作为变量发送到这个s.writeserial。to_bytesvalue这正是我答案中的代码所做的,除了a我使用了名称int_values,而不是value,为了清晰起见,请随意将其更改为您的核心内容b我假设您的十六进制数据已经被拆分为各个字节,因为您的问题似乎就是这样的,费我可以自由编辑它,如果你认为它缺少什么。做了完全相同的事情,给我在Python2.7语法错误@goyo@arslion你一定做了一些不同的事情,我仔细检查了,我发布的代码中没有语法错误。当然,如果string1、string2和Self未定义,但没有语法错误,你会得到一个NameError。s已定义字符串。sendcmd=[0x+命令[0:2],0x+命令[2:4],0x+命令[4:6],0x+命令[6:8],0x+命令[8:10],0x+命令[10:12],0x+命令[12:14],0x0D]^SyntaxEr
ror:无效令牌。这是错误。我使用“十六进制”编码将310a320a330a十六进制数据从字符串转换为字符串。我要将十六进制数据转换为:[0x31,0x0a,0x32,0x0a,0x33,0x0a]然后将它作为变量发送到这个s.writeserial。to_bytesvalue这正是我答案中的代码所做的,除了a我使用了名称int_values,而不是value,为了清晰起见,请随意将其更改为您的核心内容b我假设您的十六进制数据已经被拆分为各个字节,因为您的问题似乎就是这样的,如果您认为缺少某些内容,请随意编辑它。执行与您所做的完全相同的操作,会在Python2.7上显示语法错误@goyo@arslion您一定做了一些不同的事情,我仔细检查了一下,我发布的代码中没有语法错误。当然,如果未定义string1、string2和Self,但未定义语法错误,则会出现NameError.string。sendcmd=[0x+命令[0:2]、0x+命令[2:4]、0x+命令[4:6]、0x+命令[6:8]、0x+命令[8:10]、0x+命令[10:12]、0x+命令[12:14]、0x0D]^语法错误:无效令牌。这是错误