I was trying to make a keyboard-based controller for my robot using the UDP protocol to send packets of keypresses to an ESP8266 NodeMCU microcontroller using Python. When I wrote this code, the following error appeared:
C:UsersCHUCHDesktopPython and ArduinoledvenvScriptspython.exe" "C:/Users/CHUCH/Desktop/Python and Arduino/led/main.py"
pygame 2.0.2 (SDL 2.0.16, Python 3.9.2)
Hello from the pygame community. pygame.org/contribute.html
Traceback (most recent call last):
File "C:UsersCHUCHDesktopPython and Arduinoledmain.py", line 23, in <module>
main()
File "C:UsersCHUCHDesktopPython and Arduinoledmain.py", line 19, in main
sock.sendto("Q", (my_ip, my_port))
TypeError: a bytes-like object is required, not 'str'
Process finished with exit code 1
This is the code:
import socket
import KeyPressModule as Key
my_ip = 'Use your IP'
my_port = 8080
Key.init()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def main():
if Key.get_Key('UP'):
sock.sendto('u', (my_ip, my_port))
elif Key.get_Key('DOWN'):
sock.sendto('d', (my_ip, my_port))
elif Key.get_Key('LEFT'):
sock.sendto('l', (my_ip, my_port))
elif Key.get_Key('RIGHT'):
sock.sendto('r', (my_ip, my_port))
else:
sock.sendto('q', (my_ip, my_port))
if __name__ == '__main__':
while True:
main()
Advertisement
Answer
You got this error because the method you’re calling expects a bytes
object. This makes sense, since UDP packets consists of bytes. They do not have any notion of the meaning of those bytes, i.e. if they are text or images or something else.
If you want to send text using a byte-based protocol, you have to encode it.
In your case, since you seem to be sending one character at a time and you’re using string literals, the easiest solution is to add a b
before the letters you want to send, so b'u'
instead of 'u'
:
if Key.get_Key('UP'):
sock.sendto(b'u', (my_ip, my_port))