int ring_write(ring_buffer_t *ring, const char *data, int size) { int free_size = ring_capacity(ring) - ring_size(ring); int push_size = (size > free_size) ? free_size : size; // データ配置 if (ring->first <= ring->last) { // last から buffer_size 終端までに配置 int left_size = 0; int to_end = ring->buffer_size - ring->last; int move_size = (to_end > push_size) ? push_size : to_end; byte_move(&ring->buffer[ring->last], data, move_size); ring->last += move_size; ring->last &= (ring->buffer_size -1); left_size = push_size - move_size; if (left_size > 0) { // 0 から first の前までを配置 byte_move(ring->buffer, &data[move_size], left_size); ring->last = left_size; } } else { // last から first の前まで配置 byte_move(&ring->buffer[ring->last], data, size); ring->last += push_size; } return push_size; }
/* * 从串口读取数据 */ int serial_read(urg_serial_t *serial, char *data, int max_size, int timeout) { int buffer_size; int read_n; int filled = 0; if (max_size <= 0) { return 0; } /* If there is a single character return it */ if (serial->has_last_ch != False) { data[0] = serial->last_ch; serial->has_last_ch = False; ++filled; } if (serial->fd == INVALID_FD) { if (filled > 0) { return filled; } else { return -1; } } buffer_size = ring_size(&serial->ring); read_n = max_size - filled; if (buffer_size < read_n) { // Reads data if there is space in the ring buffer char buffer[RING_BUFFER_SIZE]; int n = internal_receive(buffer, ring_capacity(&serial->ring) - buffer_size, serial, 0); if (n > 0) { ring_write(&serial->ring, buffer, n); buffer_size += n; } } // Returns the data stored in the ring buffer if (read_n > buffer_size) { read_n = buffer_size; } if (read_n > 0) { ring_read(&serial->ring, &data[filled], read_n); filled += read_n; } // Reads data within the given timeout filled += internal_receive(&data[filled], max_size - filled, serial, timeout); return filled; }
/* ��M */ int serial_recv(serial_t *serial, char* data, int data_size_max, int timeout) { int filled; int read_n; int buffer_size; if (data_size_max <= 0) { return 0; } /* �����߂����P����������A�����o�� */ filled = 0; if (serial->has_last_ch_ != False) { data[0] = serial->last_ch_; serial->has_last_ch_ = False; ++filled; } if (! serial_isConnected(serial)) { if (filled > 0) { return filled; } return SerialConnectionFail; } buffer_size = ring_size(&serial->ring_); read_n = data_size_max - filled; if (buffer_size < read_n) { // �����O�o�b�t�@���̃f�[�^�ő���Ȃ���A�f�[�^��ǂݑ��� char buffer[RingBufferSize]; int n = internal_receive(buffer, ring_capacity(&serial->ring_) - buffer_size, serial, 0); ring_write(&serial->ring_, buffer, n); } buffer_size = ring_size(&serial->ring_); // �����O�o�b�t�@���̃f�[�^��Ԃ� if (read_n > buffer_size) { read_n = buffer_size; } if (read_n > 0) { ring_read(&serial->ring_, &data[filled], read_n); filled += read_n; } // �f�[�^���^�C���A�E�g�t���œǂݏo�� filled += internal_receive(&data[filled], data_size_max - filled, serial, timeout); return filled; }
int serial_read(urg_serial_t *serial, char *data, int max_size, int timeout) { int filled = 0; int buffer_size; int read_n; if (max_size <= 0) { return 0; } /* 書き戻した1文字があれば、書き出す */ if (serial->has_last_ch) { data[0] = serial->last_ch; serial->has_last_ch = False; ++filled; } if (serial->hCom == INVALID_HANDLE_VALUE) { if (filled > 0) { return filled; } return -1; } buffer_size = ring_size(&serial->ring); read_n = max_size - filled; if (buffer_size < read_n) { // リングバッファ内のデータで足りなければ、データを読み足す char buffer[RING_BUFFER_SIZE]; int n = internal_receive(buffer, ring_capacity(&serial->ring) - buffer_size, serial, 0); ring_write(&serial->ring, buffer, n); } buffer_size = ring_size(&serial->ring); // リングバッファ内のデータを返す if (read_n > buffer_size) { read_n = buffer_size; } if (read_n > 0) { ring_read(&serial->ring, &data[filled], read_n); filled += read_n; } // データをタイムアウト付きで読み出す filled += internal_receive(&data[filled], max_size - filled, serial, timeout); return filled; }
int serial_recv(serial_t *serial, char* data, int data_size_max, int timeout) { int filled = 0; int buffer_size; int read_n; if (data_size_max <= 0) { return 0; } if (serial->has_last_ch_) { data[0] = serial->last_ch_; serial->has_last_ch_ = False; ++filled; } if (! serial_isConnected(serial)) { if (filled > 0) { return filled; } return SerialConnectionFail; } buffer_size = ring_size(&serial->ring_); read_n = data_size_max - filled; if (buffer_size < read_n) { char buffer[RingBufferSize]; int n = internal_receive(buffer, ring_capacity(&serial->ring_) - buffer_size, serial, 0); ring_write(&serial->ring_, buffer, n); } buffer_size = ring_size(&serial->ring_); if (read_n > buffer_size) { read_n = buffer_size; } if (read_n > 0) { ring_read(&serial->ring_, &data[filled], read_n); filled += read_n; } filled += internal_receive(&data[filled], data_size_max - filled, serial, timeout); return filled; }