2014-02-01 4 views
1

Я пытаюсь получить данные через UART серийный на ПК с Silicon Labs C8051f320Ошибка при получении данных UART через последовательный порт с C8051F320

Я обычно программы в Java, так Поправьте меня, если я ошибаюсь, где-то с языка C или микроконтроллеры понимания.

Вот мой код, который обрабатывает УАППЫ Прерывания

Unsigned char Byte; 
unsigned char TX_Ready =1; 
void UART0_Interrupt (void) interrupt 4{ 
if (RI0 == 1)// Check if Rec flag is set 
{ 
      // Do nothing 

    } 

if (TI0 == 1) {     // Check if transmit flag is set 

    SBUF0 = Byte;   // copy the character from Byte to Buffer 
    TI0 = 0;    // Set Transmit flag to 0 

} 

} 

Вот мой метод для отправки данных

void SendData(){ 
unsigned char incoming_str[] = {'d','s','a','\r'}; //array of chars to send 

TX_Ready = 0; 

for(i=0;i<sizeof(incoming_str);i++) { 

Byte = incoming_str[i]; 

TI0=1; 



} 


} 

Первой проблема я получаю данные в обратном порядке (это нормально). Вторая проблема я получаю символы в неправильных данных

Вот пример вывода:

сек d

сек d

сек d

a с сек

д

сек д

с д

сек д

с д

с д

с с

д

с д

сек д

сек д

сек д

сек д

с с

d

сек d

сек d

s d

s

ответ

1

Справедливый чудо работает на всех.Вы ничего не делаете, чтобы убедиться, что обработчик прерываний синхронизирован с циклом SendData(). Поэтому ожидается, что байты будут повторяться или исчезать.

Две основные схемы. Если вы не беспокоитесь о задержках, как и сейчас, то вы не используете прерывание. Вы просто зацикливаетесь до SCON.1 == 1, а затем пишите SBUF.

Если вы заботитесь о задержке, вам необходимо прерывание. Для хранения байтов вам понадобится круговой буфер. Обработчик прерываний вытаскивает байт из буфера и записывает его в SBUF. Если буфер пуст, ему необходимо установить bool, чтобы указать, что прерывание было обнаружено, но не обслуживается. Теперь вы отправляете байты, отключая прерывания и добавляя байт (ы), который хотите отправить в круговой буфер. Если установлен флаг bool, сразу же напишите байт в SBUF и снимите флаг. Повторно включить прерывания.

1

Также проверьте источник синхронизации - и каков коэффициент отказа, вычисляющий скорость передачи/крит.

У меня когда-то было это с двумя AVR. Поскольку я не мог стабилизировать источники синхронизации в моем случае, я выполнил простую проверку, отправив «байтовый ff-байт» - например, приемник мог проверить правильность данных.

Смежные вопросы