Serial port 读取软Uart&;硬件Uart@同时
好的,我已经在MikroC编译器的PIC18f8680上创建了一个软硬件UART。Soft_Uart使用定时器0进行中断,并通过名为Soft_Uart_Break()的函数中断Soft_Uart_read()行 当我从两个uart读取一个字符时,一切都正常。但是,当我在硬件uart上发送字符串时,这些行无法正确读取该字符串 UART1_读取_文本(缓冲区,“OK”,100)Serial port 读取软Uart&;硬件Uart@同时,serial-port,interrupt,pic,uart,mikroc,Serial Port,Interrupt,Pic,Uart,Mikroc,好的,我已经在MikroC编译器的PIC18f8680上创建了一个软硬件UART。Soft_Uart使用定时器0进行中断,并通过名为Soft_Uart_Break()的函数中断Soft_Uart_read()行 当我从两个uart读取一个字符时,一切都正常。但是,当我在硬件uart上发送字符串时,这些行无法正确读取该字符串 UART1_读取_文本(缓冲区,“OK”,100) UART1_写入_文本(缓冲区) 我已经找到了导致这个问题的原因。也就是说,我的主while循环卡在Soft_UART_r
UART1_写入_文本(缓冲区) 我已经找到了导致这个问题的原因。也就是说,我的主while循环卡在Soft_UART_read()中,直到被中断中断。当它卡在那里时,硬件uart没有获得读取整个字符串的适当时间,因此它显示该字符串的一些字符 我怎样才能克服这个问题?我是否也需要为硬件uart使用单独的中断?还是怎样任何帮助都将不胜感激。 这里是我的代码剪贴
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
}
}
}
void main(){
INTCON.GIE=1;//全局中断启用
INTCON.PEIE=1;//外围端口中断启用
INTCON.TMR0IF=0x0;//清除定时器0溢出中断标志
INTCON.TMR0IE=1;//通过设置TRM0IE标志启用计时器0
T0CON.TMR0ON=1;//Timer0开/关控制位:1=启用Timer0/0=停止Timer0
T0CON.T08BIT=0;//定时器0 8位/16位控制位:1=8位定时器/计数器/0=16位定时器/计数器
T0CON.T0CS=0;//TMR0时钟源选择位:0=内部时钟(CLKO)/1=T0CKI引脚上的转换
T0CON.T0SE=0;//TMR0源边缘选择位:0=低/高/1=高/低
T0CON.PSA=1;//预分频器分配位:0=已分配预分频器;1=未分配/旁路
T0CON.T0PS2=0;//位2-0 PS2:PS0:预分频器选择位
T0CON.T0PS1=1;
T0CON.T0PS0=1;
TMR0H=0xBD;//定时器0 MSB寄存器的预设值
TMR0L=0xCD;//定时器0 LSB寄存器的预设值
而(1){
数据1=软UART读取(&错误);
软UART写入(数据1);
如果(数据1='b'){
对于(x=0;x我也有同样的问题。MikroC手册中的一些示例代码和文档似乎自相矛盾
原型是:
void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);
您的分隔符应为:
char delimit[] = "OK";
UART1_Read_Text(&dataIn,&delimit,attempts);
如果您知道所接收数据的大小,则尝试应与此相对应