Сообщение от bass1981
|
Вставил отключение прерываний
|
Как я понял, переменная int BuffCount1 при приёме увеличивается на 1, а при передаче - уменьшается. Если приём и передача происходят отдновременно, то может инкремент прерваться декрементом и запишется ошибочное значение в BuffCount1.
Я предлагаю выкинуть эту BuffCount1 совсем. Не нужна эта BuffCount1.
Просто при приёме тупо сдвигать указатель inptA1, при достижении границы буфера - сбрасывать на начало. То же самое при передаче - двигаем указатель outptA1.
Получается, что указатель чтения буфера как бы всё время догоняет указатель записи в буфер.
Проверку пустой ли буфер заменяем на
Код:
|
if (outptA1 == inptA1) {return 0;} |
Так как указатели изменяются только в своих процедурах, то никакой путаницы не будет.
И потом, такое ощущение, что у Вас пользуется только половина буфера. Дело в том, что значения двухбайтные, то есть при BUFF_SIZE =10 буфер занимает 20 байт памяти, а определение границы только по 10 байтам
Код:
|
if (inptA1 ›= bufferA1 + BUFF_SIZE) |
Я думаю, надо бы так
Код:
|
if (inptA1 ›= bufferA1 + BUFF_SIZE * 2) |