示例#1
0
/*
 *  シリアルポートからの送信可能コールバック
 */
void
sio_irdy_snd(intptr_t exinf)
{
	SPCB	*p_spcb;

	p_spcb = (SPCB *) exinf;
	if (p_spcb->rcv_fc_chr != '\0') {
		/*
		 *  START/STOP を送信する.
		 */
		(void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr);
		p_spcb->rcv_fc_chr = '\0';
	}
	else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
		/*
		 *  送信バッファ中から文字を取り出して送信する.
		 */
		(void) sio_snd_chr(p_spcb->p_siopcb,
					p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]);
		INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
		if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
			if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
				p_spcb->errorflag = true;
			}
		}
		p_spcb->snd_count--;
	}
	else {
		/*
		 *  送信すべき文字がない場合は,送信可能コールバックを禁止する.
		 */
		sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
	}
}
示例#2
0
/*
 *  シリアルポートからの送信可能コールバック
 */
void
sio_ierdy_snd(VP_INT exinf)
{
    SPCB	*spcb;

    spcb = (SPCB *) exinf;
    if (spcb->rcv_fc_chr != '\0') {
        /*
         *  START/STOP を送信する.
         */
        (void) sio_snd_chr(spcb->siopcb, spcb->rcv_fc_chr);
        spcb->rcv_fc_chr = '\0';
    }
    else if (!(spcb->snd_stopped) && spcb->snd_count > 0) {
        /*
         *  送信バッファ中から文字を取り出して送信する.
         */
        (void) sio_snd_chr(spcb->siopcb,
                           spcb->snd_buffer[spcb->snd_read_ptr]);
        INC_PTR(spcb->snd_read_ptr);
        if (spcb->snd_count == SERIAL_BUFSZ) {
            _syscall(isig_sem(spcb->spinib->snd_semid));
        }
        spcb->snd_count--;
    }
    else {
        /*
         *  送信すべき文字がない場合は,送信可能コールバックを
         *  禁止する.
         */
        sio_dis_cbr(spcb->siopcb, SIO_ERDY_SND);
    }
}