Цитата(x893 @ Aug 14 2016, 12:35)
Алгоритм работы раскрыт не полностью.
1. Что происходит если приходит байт из устройства, а
а. буфер от PC не заполнен
Я выше писала, что работа PC в режиме мастера, уточняю - работа PC запрос устройства посылкой пакета данных со стороны PC и через промежуток времени в течении 10сек ответ устройства. Работа в режиме только запрос - ответ.
Цитата
б. буфер от PC передан на устройство не полностью
- нет и ответа от устройства. Пакетный режим - известно начало и конец пакета, но пока я не хотела его определять, а тупо принимать - передавать.
Цитата
2. Что проиодит, если данные передаются в PC, а
а. Приходят данные от устройства
Не придут без запроса - см. выше.
Цитата
б. приходят данные от PC
Пока PC не получит ответ полностью от устройства, ничего передавать не будет.
Цитата
Нарисуйте на бумажке диаграмму работы (из стрелок и квадратиков).
Начальных точек входа у Вас 4
1. Приняты данные от PC
2. Отправлены данные в PC
3. Приняты данные от устройства
4. Отправлены данные в устройство.
Коды наколбасить для STM или любого другого - два часа максимум.
Вроде бы без диаграммы я ясно написала, но если надо - то нарисую.
С уважением, Вечный студент Алла.
Цитата(adnega @ Aug 14 2016, 10:55)
Я бы сделал реализацию кольцевого FIFO-буфера. Создал бы два экземпляра - на прием и на передачу.
Далее все просто:
1. При приеме символов из UART1 помещал бы их в первый буфер.
2. При приеме символов из UART2 помещал бы их во второй буфер.
3. При наличии символов в первом буфере и готовности передатчика UART2 выбирал бы их оттуда и записывал в UART2.
4. При наличии символов во втором буфере и готовности передатчика UART1 выбирал бы их оттуда и записывал в UART1.
Пример реализации кольцевого FIFO-буфера:
CODE
//-----------------------------------------------------------------------------
// void sp_tx_push(sSERIAL_PORT *port, const BYTE x)
//-----------------------------------------------------------------------------
void sp_tx_push(sSERIAL_PORT *port, const BYTE x)
{
int tmp_t;
port->tx_buf[port->tx_t] = x;
tmp_t = port->tx_t + 1;
if(tmp_t >= port->tx_size) tmp_t -= port->tx_size;
if(tmp_t != port->tx_b) port->tx_t = tmp_t;
}
//-----------------------------------------------------------------------------
// BYTE sp_tx_pop(sSERIAL_PORT *port)
//-----------------------------------------------------------------------------
BYTE sp_tx_pop(sSERIAL_PORT *port)
{
BYTE x;
if(port->tx_b == port->tx_t) return 0;
x = port->tx_buf[port->tx_b];
port->tx_buf[port->tx_b++] = 0;
if(port->tx_b >= port->tx_size) port->tx_b -= port->tx_size;
return x;
}
Опрос флагов UART, запись и чтение регистра данных UART, инициализация UART - тривиально.
Спасибо за код кольцевого буфера FIFO, но как я выше писала, не могу с флагами и приоритетами разобраться, чтобы алгоритм приема передачи между портами работал. Вот полный код с инициализацией мне бы помог.
Заранее спасибо! Вечный студент Алла.