/* * シリアルポートからの送信可能コールバック */ 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); } }
/* * シリアルポートからの送信可能コールバック */ 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); } }