好的,所以我已经完成了在MikroC编译器中在PIC18f8680上创建软件和硬件UART。 Soft_Uart使用timer0进行中断,并通过名为Soft_uart_Break()的函数中断Soft_UART_read()行。
当我从两个uart中读到一个角色时,一切都运转良好。但是当我在硬件uart上发送一个字符串时,这些字符串无法正确读取字符串; UART1_Read_Text(缓冲区,“OK”,100);
UART1_Write_Text(缓冲液);
我发现了什么导致了这个问题。也就是说,我的主while循环卡在Soft_UART_read()中,直到被中断中断。当它停留在那里时,硬件uart没有适当的时间来读取整个字符串,因此它显示了该字符串的一些字符。
我怎么能克服这个?我是否需要为硬件uart aswel使用单独的中断?或者是什么 ?任何帮助将受到高度赞赏。 这是我的代码片段;
void main() {
INTCON.GIE=1; //globle interrupt enable
INTCON.PEIE=1; //peripharel interrupt enable
INTCON.TMR0IF = 0x0; //Clear timer0 overflow interrupt flag
INTCON.TMR0IE = 1; //enable the timer0 by setting TRM0IE flag
T0CON.TMR0ON = 1; // Timer0 On/Off Control bit: 1=Enables Timer0 / 0=Stops Timer0
T0CON.T08BIT = 0; // Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CON.T0CS = 0; // TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CON.T0SE = 0; // TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CON.PSA = 1; // Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CON.T0PS2 = 0; // bits 2-0 PS2:PS0: Prescaler Select bits
T0CON.T0PS1 = 1;
T0CON.T0PS0 = 1;
TMR0H = 0xBD; // preset for Timer0 MSB register
TMR0L = 0xCD; // preset for Timer0 LSB register
while(1) {
data1 = Soft_UART_Read(&error);
Soft_UART_Write(data1);
if (data1 == 'b') {
for(x = 0; x <= strlen(alive); x++) {
Soft_UART_Write(alive[x]);
}
}
if (UART1_Data_Ready()) { // If data is received,
UART1_Read_Text(buffer, "OK", 100); // reads text until 'OK' is found
UART1_Write_Text(buffer); // sends back text
/*if (uart_rd == 'a') {
UART1_Write_Text("\rSensor 1 data\r");
}*/
//else
//UART1_Write(uart_rd); // and send data via UART
}
}
}
答案 0 :(得分:0)
我有同样的问题。 MikroC手册中的一些示例代码和文档似乎自相矛盾。
原型是:
void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);
您的分隔符应为:
char delimit[] = "OK";
UART1_Read_Text(&dataIn,&delimit,attempts);
如果您知道正在接收的数据的大小,则尝试应与此对应。