串行通信Arduino和Python3的问题



我有一些问题编写从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代码更长,这是我目前无法理解的唯一部分,它只是最复杂的项目的一部分

我无法重现您的问题。这是我测试的方式。在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 testrn'
b'read: [3]rn'

替代性基于中断的序列输入

我想补充一点,我通常不会在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);
}

最新更新