为什么python会在多行中打印一个多位数?

时间:2014-12-27 08:50:43

标签: python python-2.7 avr usart

我在python中编写了一个程序,通过USART从Atmega32(微控制器)接收二进制数,并将其打印在输出中。

另一方面,My Atmega32在中断触发时读取其PINA并使用USART将其值发送到计算机。

这是我的python程序:

>>> import serial
>>> ser=serial.Serial ('COM3')
>>> ser.open()
>>> while(1):
    ser.read()

当我以00000111(等于 7 )的方式连接PINA引脚时,我在python中看到以下输出:

'7'
'7'
'7'
'7'
'7'
'7'
.
.
.

但是当我以一种使10000111(等于 135 )的方式连接PINA引脚时,我在python中看到了以下输出:

'1'
'3'
'5'
'1'
'3'
'5'
'1'
'3'
'5'
'1'
'3'
'5'
'1'
'3'
'5'
'1'
'3'
'5'
.
.
.

如上所示,它在三行中打印 135 !为什么呢?


仅供参考:这是我在 CodeVision 中为 Atmega32 编写的程序:

interrupt [EXT_INT0] void ext_int0_isr(void)
{
printf("%d",PINA);
}

更新:我按照答案中的建议更改了ATMEGA端和Python端的程序:

我的AVR中断程序:

interrupt [EXT_INT0] void ext_int0_isr(void)
{
printf("%d",PINA);
printf("%d\n",0);
}

这是我在python中的输出:

>>> while(1):
    ser.readline()


'35\n'
'135\n'
'135\n'
'135\n'
'135\n'
'135\n'
'135\n'
'agi\x16agi\x16\xff135255\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'1350\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'1350\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'1350\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'
'135255\n'
'1350\n'
'135255\n'

如您所见,输出不是我们对AVR代码和Python代码的期望!

2 个答案:

答案 0 :(得分:4)

ser.read()一次只能返回1个字节。指定读取多个字节的计数。

>>> x = ser.read()          # reads one byte
>>> x = ser.read(10)        # reads up to ten bytes 

您也可以尝试使用ser.readline()

修改

您可以尝试在为Atmega32编写的程序中插入换行符:

interrupt [EXT_INT0] void ext_int0_isr(void)
{
printf("%d\n",PINA);
}

然后在打印前查找换行符:

mylist=[]
while True:
    char = ser.read()
    if char == '\n':
        print(mylist)
        mylist = []
        continue
    mylist.append(char)

或按照@hyades在评论中的建议使用ser.readline()

答案 1 :(得分:2)

我会尝试解释会发生什么:

在μC侧,通过串行线传输值。您必须决定发生这种格式,并使接收器使用相同的格式。

您决定使用ASCII。因此,设备会将每个值转换为数字并通过线路发送。这里的拳头问题是你没有分隔符。如果您的值为77的5倍,则会发送7777777777。但是你怎么知道它不是价值7的10倍?因此,您必须添加行分隔符。

其他选项可以是发送数据二进制文件(就像它们一样)或作为十六进制数据发送所有2个字节长(使用printf("%02x", PINA))。那你就不需要分隔符了。

您选择哪种方式,您必须使接收器与发送方兼容。

  • 如果保持原样(但使用\n),则可以使用.readline()
  • 如果您将其作为二进制文件发送,则可以保留接收器。
  • 如果您想使用十六进制格式,您必须阅读2个字节并根据需要进行转换。