为啥python在多行中打印一个多位数字?

Posted

技术标签:

【中文标题】为啥python在多行中打印一个多位数字?【英文标题】:Why python prints a single multi-digit numbers in multiple lines?为什么python在多行中打印一个多位数字? 【发布时间】:2015-02-24 06:34:27 【问题描述】:

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

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

这是我的python程序:

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

当我以 make00000111(等于 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 代码的输出不是我们所期望的!

【问题讨论】:

可能与那个 read() 函数有关。你知道哪些方法包含那个函数吗?喜欢 print ("Hello",sep="-",end="") @qqvc 据我所知,这个函数只接收一个数字作为大小!我将默认值 (=1) 替换为其他数字,但没有任何变化。 【参考方案1】:

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 在 cmets 中建议的 ser.readline()

【讨论】:

据我所知,7 (=0b00000111) 和 135 (=0b10000111) 都是一个字节!那么为什么要更改read() 函数中的默认值呢?它接收135 作为一个字节,但打印成三行(可能是三个字节!)为什么? @TheGoodUser-Amir 你在打印什么? s.read() 的值?? @TheGoodUser-Amir 你能把它改成printf("%d\n",PINA);,然后用readline()显示输出 @hyades 我尝试了您的评论,但没有任何改变。 5s 之后只出现一个空行 @TheGoodUser-Amir:您的设备返回的不是135的单个数字(字节),而是3个字符的字符串 "135"(在 ASCII 中编码为 3 个单独的字节)。因此,如果您一次只读取一个字符,您将只能得到"1""3""5"分别【参考方案2】:

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

在 µC 端,您通过串行线路传输值。您必须决定以哪种格式发生这种情况并让接收器使用相同的格式。

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

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

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

如果您保持原样(但使用\n),您可以使用.readline()。 如果您以二进制形式发送它,您可以保持接收器不变。 如果您想使用十六进制格式,您必须读取 2 个字节并根据需要进行转换。

【讨论】:

@hyades No. PINA 已经是一种 int(实际上是一个无符号字符)。 %d 将其转换为 ASCII 表示形式。

以上是关于为啥python在多行中打印一个多位数字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥数组打印在一个文件中,但发送到另一个文件时缺少数字

所以我做了一个线性搜索代码,但是当我在数组中输入一个数字时,它仍然会打印(数字没有)为啥会这样?

在Python中进行加减乘除

素数打印机停止在 251,为啥? [复制]

为啥这段代码会打印出无穷大的数字? [关闭]

华为OD机试真题 Python 实现数字反转打印