Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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
串行通信Arduino和python3出现问题_Python_Python 3.x_Arduino - Fatal编程技术网

串行通信Arduino和python3出现问题

串行通信Arduino和python3出现问题,python,python-3.x,arduino,Python,Python 3.x,Arduino,我在将python代码中的串行字节写入arduino时遇到一些问题。 python代码必须向串行端口写入arduino接收的数字 Python3代码: import serial import time ser = serial.Serial ('/dev/ttyACM0',) ser.baudrate = 115200 ser.write(str(3).encode()) #or (b'3') ser.write(str('\n').encode()) Arduino代码: void set

我在将python代码中的串行字节写入arduino时遇到一些问题。 python代码必须向串行端口写入arduino接收的数字

Python3代码:

import serial
import time
ser = serial.Serial ('/dev/ttyACM0',)
ser.baudrate = 115200
ser.write(str(3).encode()) #or (b'3')
ser.write(str('\n').encode())
Arduino代码:

void setup(){
Serial.begin (115200); //Comunicazione seriale 115200 bit
servomotore.attach(3);
pinMode(2,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(2,HIGH);
digitalWrite(12,HIGH);
servomotore.write(180);
}
/*Il loop comprende due funzioni; sensori e Mappa, attivate ogni 15 gradi di movimento del servomotore, 
sensori rileva le distanze, Mappa invia i valori al seriale, ogni ciclo del radar produce 24 valori in centimetri*/
void loop() {
  char buffer[] = {' ',' '};
if (Serial.available() > 0) {


  Serial.readBytesUntil('n', buffer, 2);
  int incremento = atoi(buffer);
如果我运行这个代码,我看不到输出,没有错误或打印,我需要用ctrl+c退出。阿杜伊诺什么也没有得到。
Arduino代码更长,这是目前我唯一无法理解的部分,它只是最复杂项目的一部分,我无法重现您的问题。下面是我如何测试它的。在Arduino Uno上设置以下程序:

void setup()
{
    Serial.begin(115200);
    Serial.println(F("Serial test"));
}

char buffer[80] = { 0 };

void loop()
{
    if (Serial.available() > 0)
    {
        Serial.readBytesUntil('\n', buffer, sizeof(buffer));
        Serial.print(F("read: ["));
        Serial.print(buffer);
        Serial.println("]");
        memset(buffer, 0, sizeof(buffer));
    }
}
以下python3脚本成功读取和写入此Arduino固件:

#!/usr/bin/env python3

import sys
from serial import Serial

def main():
    ser = Serial('/dev/ttyACM0',)
    ser.baudrate = 115200

    print(ser.readline())

    ser.write(str(3).encode())
    ser.write(str('\n').encode())

    print(ser.readline())
    return 0

if __name__ == '__main__':
    sys.exit(main())
一旦设备编程并插入电源,我将获得以下输出:

~ $ python3 so-check-serial.py 
b'Serial test\r\n'
b'read: [3]\r\n'
基于交替中断的串行输入 我想补充一点,我通常不会在Arduino中编写这样的串行处理程序。以下使用串行中断来缓冲输入,并在线路完全读取时设置标志。在本例中,我们可以等待或执行其他操作,直到接收到整行数据(即:在正确的时间保持闪烁):

#包括
易失性字符串缓冲区;
volatile bool inputComplete=false;
void serialEvent()
{
while(Serial.available())
{
char c=(char)Serial.read();
如果(c=='\n')
inputComplete=true;
其他的
缓冲区+=c;
}
}
无效设置()
{
序列号开始(115200);
序列。println(F(“序列测试”));
引脚模式(LED内置,输出);
数码写入(LED内置,低电平);
}
void循环()
{
如果(输入完成){
inputComplete=false;
Serial.println(buffer.c_str());
缓冲区=”;
}
数码写入(LED内置,!数码读取(LED内置));
延迟(500);
}

readBytesUntil('n')
如果您从未发送
n
,它将永远不会返回!这是EOF角色吗?表示行的结尾?如何用python将其写入串行?您正在指定文本字母
n
<代码>\n将是换行符,它更常用作读取终止符-但也不是从Python端发送。要做到这一点,您需要使用
serial.write()
,就像您对
3
所做的那样。我更改了代码,但它不起作用,即使使用/n,我也无法理解为什么您要在Arduino设置函数中调用
serial.begin(115200)
?您应该显示a,这意味着Arduino代码的设置部分以及循环代码。谢谢!我通过查看您的代码解决了问题,arduino端的代码错误,一切正常!
#include <Arduino.h>

volatile String buffer;
volatile bool inputComplete = false;

void serialEvent()
{
    while (Serial.available())
    {
        char c = (char)Serial.read();
        if (c == '\n')
            inputComplete = true;
        else
            buffer += c;
    }
}
void setup()
{
    Serial.begin(115200);
    Serial.println(F("Serial test"));
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
    if (inputComplete) {
        inputComplete = false;
        Serial.println(buffer.c_str());
        buffer = "";
    }
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    delay(500);
}