Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将Python serial.write()中的字节发送到Arduino_Python_Arduino_Serial Port - Fatal编程技术网

无法将Python serial.write()中的字节发送到Arduino

无法将Python serial.write()中的字节发送到Arduino,python,arduino,serial-port,Python,Arduino,Serial Port,我编写了一个python脚本,用于向Arduino发送数据和从Arduino接收数据。我可以毫无问题地接收数据,但当我发送数据时,Arduino似乎只接收垃圾。 Arduino通过USB连接到linux pc,pc运行的是Python 3.8。 由于原始代码包含大量不相关的内容,可能会分散注意力,因此我准备了最简单的草图来说明问题: Python代码: #! /usr/bin/env python import serial import time if __name__ == '__mai

我编写了一个python脚本,用于向Arduino发送数据和从Arduino接收数据。我可以毫无问题地接收数据,但当我发送数据时,Arduino似乎只接收垃圾。 Arduino通过USB连接到linux pc,pc运行的是Python 3.8。 由于原始代码包含大量不相关的内容,可能会分散注意力,因此我准备了最简单的草图来说明问题:

Python代码:

#! /usr/bin/env python

import serial
import time

if __name__ == '__main__':
    ser = serial.Serial("/dev/ttyACM0", 9600, timeout=0)
    time.sleep(5)   # Wait for Arduino to reset and init serial
    ser.write(67)
Arduino草图

const byte LED_PIN = 13;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
}

void loop() {
  if (Serial.available() > 0) {      
    byte b = Serial.read();
    if (b == 67) {
         digitalWrite(LED_PIN, HIGH);
         delay(500);
         digitalWrite(LED_PIN, LOW);
    }
  }
}
当接收到值为67(大写C)的字节时,该代码闪烁车载LED。这适用于Arduino串行监视器,但在运行Python脚本时不起作用。 我觉得我的问题可能与,但在这种情况下,重点是用户没有考虑空串行输入缓冲区的情况,而我相信问题实际上是在发送的数据。这就是为什么我决定省去接收部分,只使用板载led简化示例

更新

我成功地将python脚本中的最后一行更改为:

    ser.write(bytes([67]))
(请注意,在整数值周围添加了[])

任何人都可以解释为什么这种语法会产生正确的结果?似乎我正在将单个条目数组传递给函数bytes()


请原谅我在Pyton的拙劣技能,我知道这个问题可能是最基本的。

非常简单;您尝试的有效方法都符合pyserial库的规范

根据Pyserial文档:

write(data)
Parameters: data – Data to send.
Returns:    Number of bytes written.
Return type:    int
Raises: SerialTimeoutException – In case a write timeout is configured for the port and the time is exceeded.
Write the bytes data to the port. This should be of type bytes (or compatible such as bytearray or memoryview). Unicode strings must be encoded (e.g. 'hello'.encode('utf-8').
这就是为什么
b'C
样式与
bytes
调用一样有效


属性:

是睡眠参数秒数吗?@Juraj:是的,我设置了5秒睡眠,因为che Arduino在接收到串行连接时会自动重置,因此当接收到正确的字节时,我可以更清楚地看到led指示灯亮起。当使用ser.write(b'C')发送时,它会做什么?b行字节b=Serial.read()后的b中是什么;在Arduino号上?