2

pySerial で UART 経由で MCU と通信しようとしています。Arduino USB2Serial Light Converter を使用して、PC から PIC33F にデータを送信します。Arduino コンバーターが原因で、CTS や RTS を使用できません。

MCU にデータを送信し、MCU からデータを受信することもできました。しかし問題は、データが常にあるべきものとは限らないことです。

たとえば、MCU から端末に文字列全体を送信したいのですが、MCU プログラムのコードで指定された文字列ではありません。別の問題は、文字間の比較が機能しないことです。つまり、キャラクターを MCU に送信すると、MCU はそれをキャラクターと比較して決定を下します。

さて、いくつかのコードに進みます:

1. PIC33F から PC に文字列を送信し、pySerial で読み取る

putsU1("string");

// print a string

    int putsU1(char *s) {
     while(*s)
        putU1(*s++); 
    }

// print a character

    int putU1(int c) {
      while (_UTXBF);
        U1TXREG = c;
      return c; 
    }

このコードを介して読み取った場合の結果pySerialは次のとおりです。

In [13]: ser = serial.Serial('/dev/ttyACM0', 9600, bytesize=7, xonxoff=0)

In [14]: while True:                                                     
            print(struct.unpack('s', ser.read()))
         ....:     
('\x7f',)
('c',)
('\x11',)
('\t',)
('e',)
('y',)
('=',)
('\x7f',)

2. データを PIC33F に送信しpySerial、エコー バックします。

これは単一の文字に対してのみ機能し、文字列に対しては機能しません。また、エコーバックされる文字は、大文字と小文字の間でランダムに切り替わります。

     getsnU1(s, BUF_SIZE);

     char *getsnU1(char *s, int len) {
        char *p = s;
        int cc = 0;
        do {
           *s = getU1();
           putU1(*s);

           if ((*s == 0x8) && (s > p)) {
              putU1(' ');
              putU1(0x8);
              len++;
              s--;
              continue;
           }

           if (*s == '\n')
              continue;

           if (*s == '\r')
              break;
           s++;
          len--;
       } while (len > 1);

      *s = '\0';

      return p;
    }

UART 構成:

#define FOSC            8000000
#define FCY             (FOSC/2)
#define BAUD            9600
#define U1BRGValue      (((FCY/BAUD)/16)-1)

void initUART1(void) {
/* general UART config */
RPINR18bits.U1RXR = U1RXPIN;            // set RP5 as UART1 RX
_RP6R = 0b00011;                        // set RP6 as UART Tx pin
U1RXPINTRIS = 1;                        // set RP5 (RB5) as input
U1MODEbits.PDSEL = DATAPARITY;           // set data bits and parity
U1MODEbits.STSEL = STOPBITS;            // set stop bits
U1MODEbits.ABAUD = 0;                   // auto-baud disabled
U1MODEbits.BRGH = 0;                    // low speed baud rate
U1BRG = U1BRGValue;                     // set baud value


/* enable interrupt on error */
IEC4bits.U1EIE = 1;                     // enable UART1 error interrupt
IPC16bits.U1EIP = 6;                     // set interrupt priority to 6

/* enable RX buffer interrupt */
IEC0bits.U1RXIE = 0;                    // enable UART1 RX interrupt
U1STAbits.URXISEL = 0b00;                // interrupt flag is set when buffer is 3/4 full
IPC2bits.U1RXIP = 6;                     // set interrupt priority to 6

/* enable TX interrupt */
IEC0bits.U1TXIE = 0;


/* enable UART1 module */
U1MODEbits.UEN = 0b00;
U1MODEbits.UARTEN = 1;
_UTXEN = 1;                             // enable UART Tx

}

どこに問題があるのか​​わからないので、ちょっとイライラしています。何時間もの間、どこでもテストと読み取りを行ってきましたが、これを起動して実行するのはとても簡単に思えますが、私の側ではうまくいきません;(.私はPIC33Fにデータを書き込もうとしましたが、serial.write('text'.encode('ascii'))すべて serial.write(struct.pack('s',('test')))同じ結果が得られました.

どんな助けでも大歓迎です!

4

1 に答える 1

1

I don't think you want bytesize=7 (unless you know exactly why).

Also, a classical problem with UARTs is that individual characters work, but whole strings don't - this is usually when the receiving microcontroller does only buffer a single character in hardware. I don't know PIC, but in that code above where you do getU1() followed by putU1() I guess that putU1() waits for the duration of one character, so when you call getU1() again later you will have missed the one character (if the software did send it without pause).

My usual workaround is something like:

def write(s):
    for c in s:
        ser.write(c)
        time.sleep(0.001) # often not required

In general pyserial seems to work okay for all my projects, but you should also check with a normal terminal program to be sure. Apart from that I can only suggest you double-check the baudrate and FOSC on your microcontroller.

于 2012-06-10T08:01:03.713 に答える