我正在尝试使用pySerial通过UART与MCU通讯。
我使用Arduino USB2Serial Light Converter将数据从PC发送到PIC33F。
由于存在Arduino转换器,我无法使用CTS或RTS。
我设法将数据发送到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.使用
pySerial
将数据发送到PIC33F,并将其回显这仅适用于单个字符,不适用于字符串。同样,回显的字符也在大写和小写之间随机切换。
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
}
我有点沮丧,因为我不知道问题出在哪里。经过数小时的测试和阅读,在任何地方似乎都很难启动并运行,但对我而言就不会了;(。
我尝试使用
serial.write('text'.encode('ascii'))
将数据写入PIC33F,serial.write(struct.pack('s',('test')))
都产生相同的结果。任何帮助深表感谢!
最佳答案
我认为您不希望bytesize = 7(除非您确切知道原因)。
同样,UART的一个典型问题是单个字符可以工作,但整个字符串却不能工作-通常在接收微控制器仅在硬件中缓冲单个字符的情况下。我不知道PIC,但是在上面的代码中,您先执行getU1()之后再执行putU1(),我想putU1()等待一个字符的持续时间,因此稍后再调用getU1()时,您将错过一个字符(如果软件确实发送了它而没有暂停)。
我通常的解决方法是:
def write(s):
for c in s:
ser.write(c)
time.sleep(0.001) # often not required
通常,pyserial对于我的所有项目似乎都可以,但是您还应该使用常规的终端程序进行确认。除此之外,我只能建议您仔细检查微控制器上的波特率和FOSC。
关于python - PySerial和微 Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10964712/