/* * シリアルポートからの受信通知コールバック */ void sio_irdy_rcv(intptr_t exinf) { SPCB *p_spcb; char c; p_spcb = (SPCB *) exinf; c = (char) sio_rcv_chr(p_spcb->p_siopcb); if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) { /* * 送信を一時停止する.送信中の文字はそのまま送信する. */ p_spcb->snd_stopped = true; } else if (p_spcb->snd_stopped && (c == FC_START || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) { /* * 送信を再開する. */ p_spcb->snd_stopped = false; if (p_spcb->snd_count > 0U) { c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]; if (serial_snd_chr(p_spcb, c)) { 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 if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) { /* * 送信に対してフロー制御している場合,START は捨てる. */ } else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) { /* * バッファフルの場合,受信した文字を捨てる. */ } else { /* * 受信した文字を受信バッファに入れる. */ p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c; INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz); if (p_spcb->rcv_count == 0U) { if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) { p_spcb->errorflag = true; } } p_spcb->rcv_count++; /* * STOPを送信する. */ if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped) && p_spcb->rcv_count >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) { if (!serial_snd_chr(p_spcb, FC_STOP)) { p_spcb->rcv_fc_chr = FC_STOP; } p_spcb->rcv_stopped = true; } } }
/* * シリアルポートからの受信通知コールバック(受け口関数) */ void eiSIOCBR_readyReceive(CELLIDX idx) { CELLCB *p_cellcb; char c; assert(VALID_IDX(idx)); p_cellcb = GET_CELLCB(idx); c = (char) cSIOPort_getChar(); if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_STOP) { /* * 送信を一時停止する.送信中の文字はそのまま送信する. */ VAR_sendStopped = true; } else if (VAR_sendStopped && (c == FC_START || (VAR_ioControl & IOCTL_FCANY) != 0U)) { /* * 送信を再開する. */ VAR_sendStopped = false; if (VAR_sendCount > 0U) { c = VAR_sendBuffer[VAR_sendReadPointer]; if (serialPort_sendChar(p_cellcb, c)) { INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize); if (VAR_sendCount == ATTR_sendBufferSize) { if (ciSendSemaphore_signal() < 0) { VAR_errorFlag = true; } } VAR_sendCount--; } } } else if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_START) { /* * 送信に対してフロー制御している場合,START は捨てる. */ } else if (VAR_receiveCount == ATTR_receiveBufferSize) { /* * バッファフルの場合,受信した文字を捨てる. */ } else { /* * 受信した文字を受信バッファに入れる. */ VAR_receiveBuffer[VAR_receiveWritePointer] = c; INC_PTR(VAR_receiveWritePointer, ATTR_receiveBufferSize); if (VAR_receiveCount == 0U) { if (ciReceiveSemaphore_signal() < 0) { VAR_errorFlag = true; } } VAR_receiveCount++; /* * STOPを送信する. */ if ((VAR_ioControl & IOCTL_FCRCV) != 0U && !VAR_receiveStopped && VAR_receiveCount >= BUFCNT_STOP(ATTR_receiveBufferSize)) { if (!serialPort_sendChar(p_cellcb, FC_STOP)) { VAR_receiveFlowControl = FC_STOP; } VAR_receiveStopped = true; } } }