python和arduino串口通信,Arduino和Python之间的串行通信,使用十六进制值的问题

I am attempting to start a motor from the computer by code in Python 3.4, using pySerial to communicate to an Arduino Uno. I have packed the value I am sending to hexidecimal, so I only have one byte at a time, but am having a problem getting the correct number on the Arduino side as I am sending on the Python side.

PYTHON CODE:

import serial

import struct

ser = serial.Serial(

port ='COM4',

baudrate = 9600,

parity = serial.PARITY_ODD,

stopbits = serial.STOPBITS_TWO,

bytesize = serial.EIGHTBITS

)

#ser.open() #opens port

ser.isOpen() #returns true?

motorState = 0

wristBend = 'Left'

while True:

#need to create options to send to arduino

if wristBend == 'Left':

motorState = 2

elif wristBend == 'Right':

motorState = 3

else:

motorState = 1

motorChar = struct.pack('

#motorChar = str(hex(motorState))

print(motorChar)

ser.write(motorChar)

print(ser.read())

break

ARDUINO CODE:

int motorPinLeft = 10;

int motorPinRight = 11;

int motorSpeedLeft = 0;

int motorSpeedRight = 0;

void setup() {

pinMode(motorPinLeft, OUTPUT);

pinMode(motorPinRight, OUTPUT);

Serial.begin(9600);

while(!Serial); //waits for arduino to be ready, not neaded for duo

Serial.println("Speed 0 - 255");

}

void loop()

{

if (Serial.available())

{

int ch = Serial.read();

switch (ch)

{

case 1:

motorSpeedLeft = 0;

motorSpeedRight = 0;

break;

case 2:

motorSpeedLeft = 127;

motorSpeedRight = 0;

break;

case 3:

motorSpeedLeft = 0;

motorSpeedRight = 127;

break;

}

Serial.write(ch);

analogWrite(motorPinLeft, motorSpeedLeft);

analogWrite(motorPinRight, motorSpeedRight);

delay(2500); //wait for 2.5 seconds to make the motor vibrate

motorSpeedRight = 0;

motorSpeedLeft = 0;

analogWrite(motorPinLeft, motorSpeedLeft);

analogWrite(motorPinRight, motorSpeedRight);

Not only is nothing communicating with my circuit, but the output from my python code, where I print what is being sent to the Arduino and what is being sent from the Arduino is this:

b'\x02'

b'S'

If I change a switch case code to 83 (the ASCII code of S), or change the type of the variable to byte, int, uint8_t, I get the exact same output. What am I doing wrong here? Sorry if it is sort of obvious, I'm fairly new to python and arduino. Thanks in advance for any help!

解决方案

its not hard here is a simple example, its usually a good idea to start simple and then increase the functionality to what you want.

test_serial.py

import serial

ser = serial.Serial("COM4",timeout=5) # everything else is default

ser.write("\x45")

print "RECIEVED BACK:",repr(ser.read(5000))

test_serial.ino

int incomingByte = 0; // for incoming serial data

void setup() {

Serial.begin(9600); // opens serial port, sets data rate to 9600 bps

}

void loop() {

// send data only when you receive data:

if (Serial.available() > 0) {

// read the incoming byte:

incomingByte = Serial.read();

// say what you got:

Serial.print("I received: ");

Serial.println(incomingByte, DEC);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值