// Copies the serial_slave_buffer to the master and sends the // serial_master_buffer to the slave. // // Returns: // 0 => no error // 1 => slave did not respond int serial_update_buffers(void) { // this code is very time dependent, so we need to disable interrupts cli(); // signal to the slave that we want to start a transaction serial_output(); serial_low(); _delay_us(1); // wait for the slaves response serial_input(); serial_high(); _delay_us(SERIAL_DELAY); // check if the slave is present if (serial_read_pin()) { // slave failed to pull the line low, assume not present sei(); return 1; } // if the slave is present syncronize with it sync_recv(); uint8_t checksum_computed = 0; // receive data from the slave for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { serial_slave_buffer[i] = serial_read_byte(); sync_recv(); checksum_computed += serial_slave_buffer[i]; } uint8_t checksum_received = serial_read_byte(); sync_recv(); if (checksum_computed != checksum_received) { sei(); return 1; } uint8_t checksum = 0; // send data to the slave for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { serial_write_byte(serial_master_buffer[i]); sync_recv(); checksum += serial_master_buffer[i]; } serial_write_byte(checksum); sync_recv(); // always, release the line when not in use serial_output(); serial_high(); sei(); return 0; }
int get_num_files(serial_handle_t serial_handle) { int r; char reply[2]; // flush the serial port r = serial_flush(serial_handle); if (r < 0) { return -1; } // send the command to request the number of recorded files r = serial_write_byte(serial_handle, 0x01); if (r < 1) { return -1; } // read the reply, 2 bytes r = serial_read(serial_handle, reply, 2, 500*1000); if (r < 2) { return -1; } g_debug("cmd 0x01 (get num files), 2-byte response: 0x%02x 0x%02x", reply[0], reply[1]); // but only the second byte matters return reply[1]; }
void ta(int pi) { int h, b, e; char *TEXT; char text[2048]; printf("Serial link tests.\n"); /* this test needs RXD and TXD to be connected */ h = serial_open(pi, "/dev/ttyAMA0", 57600, 0); CHECK(10, 1, h, 0, 0, "serial open"); time_sleep(0.1); /* allow time for transmission */ b = serial_read(pi, h, text, sizeof(text)); /* flush buffer */ b = serial_data_available(pi, h); CHECK(10, 2, b, 0, 0, "serial data available"); TEXT = "\ To be, or not to be, that is the question-\ Whether 'tis Nobler in the mind to suffer\ The Slings and Arrows of outrageous Fortune,\ Or to take Arms against a Sea of troubles,\ "; e = serial_write(pi, h, TEXT, strlen(TEXT)); CHECK(10, 3, e, 0, 0, "serial write"); e = serial_write_byte(pi, h, 0xAA); e = serial_write_byte(pi, h, 0x55); e = serial_write_byte(pi, h, 0x00); e = serial_write_byte(pi, h, 0xFF); CHECK(10, 4, e, 0, 0, "serial write byte"); time_sleep(0.1); /* allow time for transmission */ b = serial_data_available(pi, h); CHECK(10, 5, b, strlen(TEXT)+4, 0, "serial data available"); b = serial_read(pi, h, text, strlen(TEXT)); CHECK(10, 6, b, strlen(TEXT), 0, "serial read"); if (b >= 0) text[b] = 0; CHECK(10, 7, strcmp(TEXT, text), 0, 0, "serial read"); b = serial_read_byte(pi, h); CHECK(10, 8, b, 0xAA, 0, "serial read byte"); b = serial_read_byte(pi, h); CHECK(10, 9, b, 0x55, 0, "serial read byte"); b = serial_read_byte(pi, h); CHECK(10, 10, b, 0x00, 0, "serial read byte"); b = serial_read_byte(pi, h); CHECK(10, 11, b, 0xFF, 0, "serial read byte"); b = serial_data_available(pi, h); CHECK(10, 12, b, 0, 0, "serial data availabe"); e = serial_close(pi, h); CHECK(10, 13, e, 0, 0, "serial close"); }