首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino从串行监视器中提取数据

Arduino从串行监视器中提取数据
EN

Stack Overflow用户
提问于 2022-12-02 13:59:32
回答 1查看 35关注 0票数 0

我用Python为我的机器人编写了一个简单的控制器,现在我想通过串行监视器将数据发送给Arduino。我成功地发送了这些值,但现在我想知道如何使用Arduino从监视器中提取数据。我的Python代码:

代码语言:javascript
复制
import PySimpleGUI as sg
import serial
import time
import math

ArmLänge = 205

TextX = 10
TextY = 10
TextZ = 10

font = ("Courier New", 11)
sg.theme("DarkBlue3")
sg.set_options(font=font)

ser = serial.Serial("COM6")
ser.flushInput()

layout = [
    [sg.Text("Forward Kinematics:", font=("Helvetica", 12)), sg.Text("              Inverse Kinematics:", font=("Helvetica", 12))],
    [sg.Text("X"), sg.Slider((0, 360), orientation='horizontal', key='SLIDER_X'), sg.Text("X"),sg.InputText(size=(10, 10), key="InputX")],
    [sg.Text("Y"), sg.Slider((0, 360), orientation='horizontal', key='SLIDER_Y'), sg.Text("Y"),sg.InputText(size=(10, 10), key="InputY")],
    [sg.Text("Z"), sg.Slider((0, 360), orientation='horizontal', key='SLIDER_Z'), sg.Text("Z"),sg.InputText(size=(10, 10), key="InputZ")],
    [sg.Push(), sg.Button('Exit'), sg.Button("Move")],
]

window = sg.Window("Controller", layout, finalize=True)
window['SLIDER_X'].bind('<ButtonRelease-1>', ' Release')
window['SLIDER_Y'].bind('<ButtonRelease-1>', ' Release')
window['SLIDER_Z'].bind('<ButtonRelease-1>', ' Release')

while True:
    event, values = window.read()
    if event in (sg.WINDOW_CLOSED, 'Exit'):
        break
    elif event == 'SLIDER_X Release':
        print("X Value:", values["SLIDER_X"])
    elif event == 'SLIDER_Y Release':
        print("Y Value:", values["SLIDER_Y"])
    elif event == 'SLIDER_Z Release':
        print("Z Value:", values["SLIDER_Z"])
    #elif event == "Move":
        #print("IK X:", values['InputX'])
        #print("IK Y:", values['InputY'])
        #print("IK Z:", values['InputZ'])

    valX = int(values["SLIDER_X"]/2)
    valY = int(values["SLIDER_Y"]/2)
    valZ = int(values["SLIDER_Z"]/2)

    Data = [1,valX,valY,valZ]
    print(Data)
    ser.write(Data)

    if values['InputX'] >= str(1):
        x = float(values['InputX'])
        y = float(values['InputY'])
        z = float(values['InputZ'])

        h = round(math.sqrt(x ** 2 + y ** 2))
        joint2 = round(math.degrees(math.atan(y / x)))
        joint3 = round(math.degrees(math.acos((h / 2) / (ArmLänge / 2))))

        print("----Ergebnis:----")
        print("Höhe:", h)
        print("Joint2:", joint2,"°")
        print("Joint3:", joint3,"°")

        IKData = [2, h, joint2, joint3]
        print(IKData)
        ser.write(IKData)

window.close()
ser.close()

这可能不是最好的代码,但它有效。我需要提取每个数字,例如1,20,45,30。我怎么能这么做?

EN

回答 1

Stack Overflow用户

发布于 2022-12-03 09:48:14

我假设数据以这种格式以字符串的形式进入Serial:

1,valX,valY,valZ

读取Serial中的数据并使用String()函数将数据行转换为String ()之后,可以使用sscanf()函数将这些值赋值给所需的变量。

功能是这样运作的-

扫描f( const *str,const*格式,.)

所以,在这里它会像这样工作-

代码语言:javascript
复制
int data_val1, data_val2, data_val3;

sscanf(Your_SerialData_String, [1,%d,%d,%d], data_val1, data_val2, data_val3);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74656927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档