Operating system uart传输缓冲区就绪信号卡在串行传输中

Operating system uart传输缓冲区就绪信号卡在串行传输中,operating-system,serial-port,uart,Operating System,Serial Port,Uart,未启用中断的终端uart驱动器 void TerminalInit_polledio(int term_num) { int BAUD_RATE = 9600; int divisor = 115200 / BAUD_RATE; // first setup our vars terminals[term_num].echo_mode = TRUE; terminals[term_num].missed_intr = TRUE; // Use a pair of se

未启用中断的终端uart驱动器

void TerminalInit_polledio(int term_num)
{
   int BAUD_RATE = 9600;
   int divisor = 115200 / BAUD_RATE;

// first setup our vars
   terminals[term_num].echo_mode = TRUE;
   terminals[term_num].missed_intr = TRUE;

// Use a pair of sems. One limits available space in the output queue
// (terminal display), the other limits chars that are typed from the
// terminal. As part of initialization, the count of the output queue
// is set to the capacity of the char queue
  // terminals[term_num].out_sid = SemInit(CHAR_Q_SIZE); 
  // a circular q, capacity CHAR_Q_SIZE
  // terminals[term_num].in_sid = SemInit(0);

   InitCharQ(&terminals[term_num].in_q);   // initially empty
   InitCharQ(&terminals[term_num].out_q);  // initially empty
   InitCharQ(&terminals[term_num].echo_q); // initially empty

// then setup the terminal for 7-E-1 at 9600 baud
// abbrevs:
// CFCR Char Format Control Reg, MSR Modem Status Reg, IIR Intr Indicator Reg
// MCR Modem Control Reg, IER Intr Enable Reg, LSR Line Status Reg
// ERXRDY Enable Recv Ready, ETXRDY Enable Xmit Ready
// LSR_TSRE Line Status Reg Xmit+Shift Regs Empty
   outportb(terminals[term_num].io_base + CFCR, CFCR_DLAB); // CFCR_DLAB is 0x80
   outportb(terminals[term_num].io_base + BAUDLO,LOBYTE(divisor));
   outportb(terminals[term_num].io_base + BAUDHI,HIBYTE(divisor));
   outportb(terminals[term_num].io_base + CFCR,CFCR_8BITS ); //8-N-1
   outportb(terminals[term_num].io_base + IER,0);
   // raise DTR & RTS of the serial port to start read/write
   outportb(terminals[term_num].io_base + MCR, MCR_DTR | MCR_RTS | MCR_IENABLE);
   outportb(terminals[term_num].io_base + IER,0);
   //IO_DELAY();
   //outportb(terminals[term_num].io_base + IER, IER_ERXRDY | IER_ETXRDY);
   //IO_DELAY();

   //FIFO stuff 
   outportb(terminals[term_num].io_base + FIFO, FIFO_ENABLE | FIFO_TRIGGER_8);
   outportb(terminals[term_num].io_base + FIFO, FIFO_RCV_RESET | FIFO_XMT_RESET);
}

u8 get_serial_char_polledio() {
  u8 status;
  //printf("=>");
   while(!(inportb(terminals[FT_TERM].io_base + LSR) & LSR_RXRDY)){
     //cons_printf("%2.0x_",status);
   }
   return (inportb(terminals[FT_TERM].io_base + DATA) & 0x7F);
}

void put_serial_char_polledio(u8 ch) {
    char status = inportb(terminals[FT_TERM].io_base + LSR) & LSR_TXRDY ;

    while(!status) {
      //cons_printf(" <%2.0x_%c> ",status,ch);
    }
    outportb(terminals[FT_TERM].io_base + DATA, ch);
    inportb(terminals[FT_TERM].io_base + LSR) & LSR_TXRDY ;
//     cons_printf(" <%2.0x_%c> ",status,ch);
}


void uart_out(){
    char ch = 'A';
    while(1){
      put_serial_char_polledio(ch);
      //printf("%c ",get_serial_char_polledio());
    }
}
void TerminalInit\u polledio(int term\u num)
{
整数波特率=9600;
整数除数=115200/波特率;
//首先设置我们的VAR
终端[term_num]。回波模式=真;
终端[term_num]。遗漏的\u intr=TRUE;
//使用一对SEM。其中一个限制输出队列中的可用空间
//(终端显示),从
//终端。作为初始化的一部分,输出队列的计数
//设置为字符队列的容量
//终端[term_num].out_sid=SemInit(字符大小);
//循环q,容量字符q大小
//终端[term_num]。in_sid=SemInit(0);
InitCharQ(&terminals[term_num].in_q);//最初为空
InitCharQ(&terminals[term_num].out_q);//最初为空
InitCharQ(&terminals[term_num].echo_q);//最初为空
//然后将7-E-1的终端设置为9600波特
//缩写:
//CFCR字符格式控制寄存器、MSR调制解调器状态寄存器、IIR Intr指示器寄存器
//MCR调制解调器控制寄存器、IER Intr启用寄存器、LSR线路状态寄存器
//ERXRDY Enable Recv Ready,ETXRDY Enable Xmit Ready
//LSR_TSRE线路状态寄存器Xmit+移位寄存器为空
outportb(终端[term_num].io_base+CFCR,CFCR_DLAB);//CFCR_DLAB为0x80
输出端口B(终端[term_num].io_base+BAUDLO,LOBYTE(除数));
输出端口B(终端[term_num].io_base+BAUDHI,HIBYTE(除数));
outportb(终端[term_num].io_base+CFCR,CFCR_8bit);//8-N-1
outportb(终端[term_num].io_base+IER,0);
//提高串行端口的DTR和RTS以开始读/写
输出端口B(终端[term_num].io_base+MCR、MCR_DTR | MCR|u RTS | MCR|IENABLE);
outportb(终端[term_num].io_base+IER,0);
//IO_延迟();
//输出端口B(终端[term_num].io_base+IER,IER_ERXRDY | IER_ETXRDY);
//IO_延迟();
//先进先出的东西
输出端口B(终端[term_num].io_base+FIFO,FIFO_ENABLE | FIFO_TRIGGER_8);
输出端口B(终端[term_num].io_base+FIFO,FIFO_RCV_RESET | FIFO_XMT_RESET);
}
u8 get_serial_char_polledio(){
u8状态;
//printf(“=>”);
while(!(输入端口B(终端[FT_TERM].io_base+LSR)和LSR_RXRDY)){
//cons_printf(“%2.0x”,状态);
}
返回(输入端口B(终端[FT\u TERM].io\u base+DATA)&0x7F);
}
无效放置\u序列\u字符\u轮询(u8通道){
char status=inportb(终端[FT_TERM].io_base+LSR)&LSR_TXRDY;
而(!状态){
//cons_printf(“”,状态,ch);
}
outportb(终端[FT_TERM].io_base+DATA,ch);
输入端口B(终端[FT_TERM].io_base+LSR)&LSR_TXRDY;
//cons_printf(“”,状态,ch);
}
无效uart_out(){
char ch='A';
而(1){
把串行字符放入polledio(ch);
//printf(“%c”,get_serial_char_polledio());
}
}

uart_out()是在我的操作系统中作为进程被调度和运行的方法,但是在放入或传输字符a一次之后,进程就会停止,不再输出字符。有什么遗漏吗?

请确保端口上的握手线路都已启用并设置为允许传输。我发现了问题,在将字符写入寄存器后,我必须为状态寄存器返回提供一个延时。如果我给一个时间延迟,我可以根据需要输入字符。方法put\u serial\u char\u polledio应该如下所示,其他人可以回答吗?感谢void put_serial_char_polledio(u8 ch){while(!(输入端口B(终端[FT_TERM].io_base+LSR)&LSR_TXRDY)){//cons_printf(“,status,ch);}}@bicepjai:你为什么不自己回答呢?设置延时会破坏线路状态寄存器和Tx FIFO缓冲区的目的,我说你的代码仍然是坏的,而你的解决方案仅仅是延迟到位也是一个非常糟糕的主意。我也有同样的问题,但我不打算延迟修改代码。