首页 文章

Python没有从arduino串行输出中读取正确的值

提问于
浏览
11

我正在尝试使用python从arduino中读取电位计值 . 但我的串行读取值很奇怪 .

Python代码:

import serial

ser = serial.Serial('COM12')

print ( "connected to: " + ser.portstr )
count = 1                    

while True:
    for line in ser.read():
        print( str(count) + str( ': ' ) + str( line ) )
        count = count + 1


ser.close()

Arduino代码:

int potpin = 0;  // analog pin used to connect the potentiometer
int val = 0;       // variable to store the value coming from the sensor
int oldVal = 0;   // used for updating the serial print

void setup() 
{ 
  Serial.begin(9600);
} 

void loop() 
{ 
  val = analogRead(potpin);             
  val = map(val, 0, 1023, 0, 179);     

  if( val != oldVal )
  {
    Serial.print(val);         // print the value from the potentiometer
    oldVal = val;
  }

  delay(100);
}

一些Python输出:这个输出来自电位器的直接,缓慢增加,我从来没有在任何时候将其调低 .

1: 56
2: 57
3: 49
4: 48
5: 49
6: 49
7: 49
8: 50
9: 49
10: 51

当我运行arduino串行终端时,我得到的值范围为0-179 . 为什么Python不能从串口获取正确的值?

谢谢

编辑:

解决了这个问题 . 48-55是1-9的ascii值,因此更改python代码以打印字符而非值 . 然而,这会导致另一个问题,即它打印个别数字 . 例如,数字“10”以单个“1”和“0”形式出现 . 这可以通过在arduino sketch中使用Serial.write而不是Serial.print来解决 . 这也意味着您将收到一个字节,这是您的数字,而不是数字的ascii值,因此您不需要将读取行的值从一个值转换为ascii .

希望这可以帮助 .

1 回答

  • 2

    让我尝试提供一些可能对其他有类似问题的人有帮助的评论(即使这个问题已经解决) . 首先,尝试使用串行监视器运行Arduino草图几次 . 您可以在IDE菜单中的Tools下找到Serial Monitor . 您也可以键入Ctrl-Shift-M来调用串行监视器 .

    看看会出现什么 . 如果您的草图尝试通过Serial.print()发回数据,这通常会非常有用 . 几点说明 . 确保串行监视器内设置的波特率与草图中的波特率完全匹配(9600在几乎所有情况下都是一个不错的选择) .

    第二个注释很关键 . 启动串行监视器会强制重置Arduino板 . 你的草图重新开始(总是) . 这是一件好事,因为它每次都给你一个新的运行 . 请注意,您可以强制重置,只需将波特率设置为9600(即使它已经是9600) . 这使您可以在串行监视器内运行许多测试,而无需每次都重新启动串行监视器 .

    至于你原来的问题,你可能应该有某种数据分隔符 . 例如,您可以发送<53>之类的值 . 在Python中,你会扫描'<'然后继续读数字,直到你得到'>' . 这将允许多个数字作为一个数值发送 .

相关问题