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')))
同じ結果が得られました.
どんな助けでも大歓迎です!