【问题标题】:How can I send a 16 bit word useing Python socket.send() instead of a 8bit one如何使用 Python socket.send() 而不是 8 位发送 16 位字
【发布时间】:2020-12-09 22:56:21
【问题描述】:

我试图在我的 PC 和传感器设备之间建立 SPI 通信。为此,我使用 TCP/IP 到 SPI 转换器。项目的这一方面已经开始工作。我可以通过 TCP/IP 向转换器发送一些东西,它就完成了它的工作。

那么问题出在哪里?我使用套接字库。在 Python 3.8 中做 TCP/IP 端:

import socket, sys

TCP_IP = '192.168.100.100'
TCP_PORT = 1003
BUFFER_SIZE = 1024

s = socket.socket()

try:
    s.connect((TCP_IP, TCP_PORT))

except socket.error as mag:
    print (" Socket Erroer: " + str(mag))

s.send(b'\x8000')
data = s.recv(BUFFER_SIZE)
print(data)

我想要做的是发送(二进制1000 0000 0000 0000(= 8000 十六进制)。 但是 python 将 \x8000 拆分为 \x80\x00 并将其作为两个 8 位字发送为 1000 0000,然后是第二个包 0000 0000。但是转换器需要它作为 16 位字,否则它会将其填满。 SPI信号是0000 0000 1000 0000 0000 0000 0000 0000,太可怕了,没有前8位我无法读取单个寄存器。

那么有没有办法将 /x8000 作为一个 16 位字发送? 我还想了解更多关于数据类型(或其他)的信息 b' something ' 那是什么?它有什么作用?

感谢您阅读本文!我对所有的建议和批评持开放态度。我希望你能帮助我谢谢你的每一次尝试!

【问题讨论】:

  • 不,您不能通过套接字发送一个 16 位字,但您可以发送两个 8 位字。
  • 好吧...这不酷,两个 8 位之间的转换器时间太长了
  • 这是 TCP/IP 的一般特性吗?或者我可以用不同的库或语言解决它吗?
  • 它是一个 TCP 的东西,虽然是一个流,但每个单元都是一个八位字节,通常称为一个字节。现在,您可以通过 TCP 形成另一个协议并将流转回数据包。必须有数百个选项。首先寻找protocol buffers

标签: python sockets binary hex spi


【解决方案1】:

您可以使用 Python raw socket 在单个数据包中包含 16 位并发送。

b'something' 是 python 表示法,将字符串“something”转换为其二进制形式(字节),默认为utf-8
例如,如果您编码a=b'Hello',则a 将具有\x48\x65\x6C\x6C\x6F

【讨论】:

  • 您好,感谢您的提示。但我不明白如何使用原始套接字。如果我像下面页面上的示例那样执行 s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 。我得到一个错误。在 init _socket.socket.__init__(self, family, type, proto, fileno) OSError: [WinError 10013] Der Zugriff auf einen Socket war aufgrund der Zugriffsrechte des Sockets unzulässig
  • 请参考this链接。它可能对你有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2013-09-12
  • 2016-03-10
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多