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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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和Arduino问题_Python_Arduino_Pyserial - Fatal编程技术网

Python和Arduino问题

Python和Arduino问题,python,arduino,pyserial,Python,Arduino,Pyserial,我遇到了一些问题,试图控制一个从python连接到arduino板的伺服。 在程序中,我写入一个值0–180并将其发送到Arduino,Arduino应将伺服旋转到选定的位置。问题在于,从python发送的数据没有被正确读取。(或书写正确)。在谷歌搜索、尝试和失败之后,我仍然有同样的问题。 从python发送数据时,te伺服从起始位置移动到几乎中心位置,然后返回起始点 我现在修改了代码,让Arduino现在回复python,返回它接收到的数据,我不明白发生了什么。我输入值1。Arduino回答说

我遇到了一些问题,试图控制一个从python连接到arduino板的伺服。 在程序中,我写入一个值0–180并将其发送到Arduino,Arduino应将伺服旋转到选定的位置。问题在于,从python发送的数据没有被正确读取。(或书写正确)。在谷歌搜索、尝试和失败之后,我仍然有同样的问题。 从python发送数据时,te伺服从起始位置移动到几乎中心位置,然后返回起始点

我现在修改了代码,让Arduino现在回复python,返回它接收到的数据,我不明白发生了什么。我输入值1。Arduino回答说:b'5。如果我写1。Arduino回复为b'2。。如果我写2,它会以b'5作为响应,如果我写5:S也是一样的(而且并不总是一样的)

我使用的Python代码:

import serial

def sendSerialData():
  global set_ser, run
  set_ser = serial.Serial()
  set_ser.port="COM4"
  set_ser.baudrate=9600

  print('**********************')
  print('* Serial comunicator *')
  print('**********************\n')
  run = 0
  while run==0:
    print('type \'open\'to open serial port. \ntype \'close\' anyplace in the procram to close serial port:')
    openSerial = input(': ').lower()
    if (openSerial == "open"):
      set_ser.close()
      set_ser.open()
      while set_ser.isOpen():
        output = input('\nType what you want to send, hit enter\n:  ')
        set_ser.write(output.encode())

        print('Arduino is retriving: ')
        print(set_ser.read())
        if (output == "close"):
          set_ser.close()
          print ('Closed')
          a = 1
    elif (openSerial == "close"):
      set_ser.close()
      a = 1
    else:
      print ('open or close')
sendSerialData()
Arduino代码:

int pos = 0;    // variable to store the servo position

int incomingByte= 180;
void setup() {
  myservo.attach(5);  // attaches the servo on pin 5 to the servo object
  Serial.begin(9600);

}

void loop() {

    byte incomingByte = Serial.read();
    pos = incomingByte;
    myservo.write(pos); 

    Serial.print(pos);
    delay(500);
以下是程序中的输出:

type 'open'to open serial port. 
type 'close' anyplace in the procram to close serial port:
: open

Type what you want to send, hit enter
:  100
Arduino is retriving: 
b'\xff'

Type what you want to send, hit enter
:  1
Arduino is retriving: 
b'2'

Type what you want to send, hit enter
:  5
Arduino is retriving: 
b'5'

Type what you want to send, hit enter
:  2
Arduino is retriving: 
b'5'

Type what you want to send, hit enter
有人知道怎么解决这个问题吗?我需要把二进制转换成十进制吗。我试图将incommingByte声明为int和byte,但结果并不完全相同,但几乎相同

谢谢你的帮助

我使用:
python3.4、pyserial和windows10

我认为您的问题在于代码的arduino方面。通过串行协议发送数据时,所有纯文本(包括整数)都会转换为ASCII。例如,小写字母“a”转换为97,因此当您说:

byte incomingByte = Serial.read();
pos = incomingByte;
myservo.write(pos); 
您正试图将ASCII数字写入伺服,因此,如果您写入42,可能会得到5250而不是42。解决此问题的一种可能方法是将字节强制转换为字符:

byte incomingByte = Serial.read();
pos = char(incomingByte);
myservo.write(pos);
您可能还希望仅在接收数据时执行此操作:

if (Serial.available() > 0) {
byte incomingByte = Serial.read();
pos = char(incomingByte);
myservo.write(pos);
希望这有帮助


-Dave

我认为你的问题在于代码的arduino方面。通过串行协议发送数据时,所有纯文本(包括整数)都会转换为ASCII。例如,小写字母“a”转换为97,因此当您说:

byte incomingByte = Serial.read();
pos = incomingByte;
myservo.write(pos); 
您正试图将ASCII数字写入伺服,因此,如果您写入42,可能会得到5250而不是42。解决此问题的一种可能方法是将字节强制转换为字符:

byte incomingByte = Serial.read();
pos = char(incomingByte);
myservo.write(pos);
您可能还希望仅在接收数据时执行此操作:

if (Serial.available() > 0) {
byte incomingByte = Serial.read();
pos = char(incomingByte);
myservo.write(pos);
希望这有帮助


-Dave

Dave帮助我意识到这是arduino代码,它只读取字符串中的1个字符。在谷歌搜索之后,我发现要正确读取数据,我必须使用`

Serial.parseInt()`

解决了伺服返回起始位置的问题;谢谢你,戴夫

我的arduino代码no看起来像:

int pos;    // variable to store the servo position
int incomingByte;
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
void setup() {




  myservo.attach(5);  // attaches the servo on pin 5 to the servo object
  Serial.begin(9600);

}

void loop() {

if (Serial.available() > 0) {
int incomingByte = Serial.parseInt();

myservo.write(incomingByte);


}

delay(500);
}

我现在可以通过软件输入一个介于0到180度之间的数字来控制伺服系统:

Dave帮助我意识到这是arduino代码的一部分,它只能读取字符串中的1个字符。在谷歌搜索之后,我发现要正确读取数据,我必须使用`

Serial.parseInt()`

解决了伺服返回起始位置的问题;谢谢你,戴夫

我的arduino代码no看起来像:

int pos;    // variable to store the servo position
int incomingByte;
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
void setup() {




  myservo.attach(5);  // attaches the servo on pin 5 to the servo object
  Serial.begin(9600);

}

void loop() {

if (Serial.available() > 0) {
int incomingByte = Serial.parseInt();

myservo.write(incomingByte);


}

delay(500);
}

现在,我可以通过软件输入一个介于0到180度之间的数字来控制伺服系统:

Hi!这对我有进一步的帮助,因为你让med意识到arduino只读取字符串中的第一个字符。谷歌现在给了我答案。嗨!这对我有进一步的帮助,因为你让med意识到arduino只读取字符串中的第一个字符。谷歌现在给了我答案。