我有使用串行通信用Python和Arduino编写的代码,我最初没有把它组织成函数或类,所以我现在尝试这样做,以使它更易读和更容易使用。但是,我无法从无限循环切换到可以多次调用的函数。无限循环完全工作,使电机运行并打印出正确的语句,并且该功能实现了打印语句,但它不会使电机运行。
具有无限循环的通用Python代码:
while True:
ser.write('a'.encode()) #used as an initial byte
...other code... mostly assigning values to the variables below
motorBytes = bytearray([decToByte(left), decToByte(right), decToByte(leftMid), decToByte(rightMid), distPerc]) #puts the motor values into an array as hex
print(motorBytes)
ser.write(motorBytes)
具有函数的通用Python代码:
def motor_loop(distObject, forceGraspL, forceGraspR, maxForceL, maxForceR):
ser.write('a'.encode())
...other code... mostly assigning values to the variables below
motorBytes = bytearray([decToByte(left), decToByte(right), decToByte(leftMid), decToByte(rightMid), distPerc]) #puts the motor values into an array as hex
print(motorBytes)
ser.write(motorBytes)
return
motor_loop(1.5, 0, 30, 60, 60) #call the function
这些值是任意的,因为我打印的是通过两端串行通信发送的值,它们是正确的值。
Arduino将军代码:
void loop()
{
while (Serial.available()>0) //checks to see if anything needs to be sent,
{ //denoted by recieveing signal from pySerial
char inByte = Serial.read();
if (inByte == 'a')
{
run_loop();
}
}
}
void run_loop()
{
int num = Serial.readBytes(values, 5);
if (num < 5)
{
return;
}
writeMotor(mtrPinLeft, mtrSpeedLeft, mtrPinRight, mtrSpeedRight, mtrPinLeftMid, mtrSpeedLeftMid, mtrPinRightMid, mtrSpeedRightMid);
(其中writeMotor是一个将所有电机值写入正确引脚的函数。)
我感觉run_loop()中的arduino位中的代码部分:带有返回,以便在不保存所有数据的情况下使函数不运行。任何人都可以确认这种预感并对我如何解决这个问题有任何建议吗?我也不是很熟悉函数,所以我可能会错过一些如何处理函数的东西。提前谢谢!
编辑: ser声明为ser = serial.Serial(port ='COM4'),上面的所有变量(left,right,leftMid等)都在空格中声明它说其他代码