我试图在笔记本电脑上运行的 Arduino 和 Python 3 之间进行通信。Arduino应该接收0x30
,即ASCII0
并用ASCII回复"Arduino reachable."
(见最后的代码)。Python 代码非常简单:
import serial, time
ports=['/dev/ttyACM0']
fixture = serial.Serial(port=ports[0],baudrate=9600,timeout=2,stopbits=sm.serial.STOPBITS_ONE,parity=sm.serial.PARITY_EVEN,bytesize=sm.serial.EIGHTBITS)
fixture.write(b'0')
time.sleep(0.1)
if (fixture.inWaiting() > 0):
dataStr = port.read(fixture.inWaiting())
print(dataStr)
fixture.close()
Arduino 正在回复,但回复没有多大意义:'A.V¥n\x0b\x92\x95a,+\x89lY©'
. 最后,我改变parity
了serial.PARITY_NONE
,这就像做梦一样。
另外,我建议使用以下等待数据出现的方法:
TIMEOUT = 20
timeoutCounter=0
while fixture.inWaiting() <= 0: # Wait for data to appear.
time.sleep(0.1)
timeoutCounter += 1
if timeoutCounter == TIMEOUT:
fixture.close()
raise BaseException('Getting test data from the Arduino timed out.')
相关Arduino代码
void setup()
{
Serial.begin(9600);
}
void loop()
{
char cmdChar = '0'; // Which test case to execute. 0 - do nothing.
// Wait until there is something in the serial port to read.
if (Serial.available() > 0)
{
// Read the incoming serial data.
cmdChar = Serial.read();
// Eexecute the chosen test case.
switch(cmdChar)
{
case '0':
Serial.print("Arduino reachable."); // Send ASCII characters.
break;
}
}
}
警告
很抱歉,我不得不在发布之前编辑此代码,并且没有机会重新测试它。但是,问题中报告的错误的主要解决方案仍然存在:
- 错误的奇偶校验(也可能是停止位),
- 等待数据出现的时间不足(可能不是问题的原因,但绝对是一种不好的做法)。