3

USART経由でAtmega32(マイクロコントローラー)から2進数を受け取り、それを出力に出力するプログラムをPythonで作成しました。

一方、My Atmega32 は、割り込みの発生時に PINA を読み取り、その値を USART を使用してコンピューターに送信します。

これは私のpythonプログラムです:

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

( 700000111に等しい)の方法で PINA ピンを接続すると、Python で以下の出力が表示されます。

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

しかし、( 13510000111に等しい)ようにPINAピンを接続すると、pythonで以下の出力が表示されます。

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

上記のように、3 行で135が出力されます。なんで?


参考までに:これは、CodeVisionAtmega32用に作成したプログラムです。

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 コードから期待したものではありません!

4

2 に答える 2

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)

またはser.readline()、コメントで@hyadesの提案に従って使用してください。

于 2014-12-27T08:55:34.697 に答える