Как на Си передать информацию от микроконтроллера на COM- порт?

330
19 декабря 2016, 19:58

Добрый вечер. Занимаюсь изучением программирования микроконтроллеров АВР, и столкнулся с вопросом передачи данных от микроконтроллера на ПК через ком порт. Пишу на Си, МК Atmel AtMega32.

Answer 1

Для передачи информации от МК на COM-порт ПК используется интерфейс RS-232. На микроконтроллерах AVR он называется USART(универсальный синхронно-асинхронный приемо передатчик). Вы написали, что программа на Си, но не указали какой компилятор Вы используете, поэтому ниже приведу программу написанную в CodeVision AVR, но перенести ее на любой другой C компилятор микроконтроллеров AVR не должно составить особых сложностей. Есть два пути создания такого рода ПО. 1) Воспользоваться стандартным генератором начального кода, который имеется в CodeVisionAVR. Для этого нужно выполнить следующие шаги.

а) при создании нового проекта, выбрать "использовать CodeWizard"
б) перейти на вкладку USART и там поставить галочки перед приемником и передатчиком, то есть активизировать их.
в) задать скорость приема передачи информации и другие параметры, синхронность асинхронность, кол-во стоп битов и т.д.
г) нажать генерировать ПО
д) далее используя стандартную библиотеку ввода-вывода отправлять и принимать информацию.

2) Написать ручками ниже приведенный код:

 #include <mega32.h> 
     #include <delay.h> 
     #include <stdio.h>
     void main(void) 
     {
     // Input/Output Ports initialization 
     // Port A initialization 
     // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
     // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
     PORTA=0x00; 
     DDRA=0x00;
     // Port B initialization 
     // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In 
     // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T 
     PORTB=0x00; 
     DDRB=0x0C;
     // Port C initialization 
     // Func7=Out Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
     // State7=0 State6=0 State5=T State4=T State3=T State2=T State1=0 State0=0 
     PORTC=0x00; 
     DDRC=0xC3;
     // Port D initialization 
     // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
     // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
     PORTD=0x00; 
     DDRD=0x88;
     // Timer/Counter 0 initialization 
     // Clock source: System Clock 
     // Clock value: 250,000 kHz 
     // Mode: Fast PWM top=FFh 
     // OC0 output: Non-Inverted PWM 
     TCCR0=0x6B; 
     TCNT0=0x00; 
     OCR0=0x5F;
     // Timer/Counter 1 initialization 
     // Clock source: System Clock 
     // Clock value: Timer 1 Stopped 
     // Mode: Normal top=FFFFh 
     // OC1A output: Discon. 
     // OC1B output: Discon. 
     // Noise Canceler: Off 
     // Input Capture on Falling Edge 
     // Timer 1 Overflow Interrupt: Off 
     // Input Capture Interrupt: Off 
     // Compare A Match Interrupt: Off 
     // Compare B Match Interrupt: Off 
     TCCR1A=0x00; 
     TCCR1B=0x00; 
     TCNT1H=0x00; 
     TCNT1L=0x00; 
     ICR1H=0x00; 
     ICR1L=0x00; 
     OCR1AH=0x00; 
     OCR1AL=0x00; 
     OCR1BH=0x00; 
     OCR1BL=0x00;
     // Timer/Counter 2 initialization 
     // Clock source: System Clock 
     // Clock value: 250,000 kHz 
     // Mode: Fast PWM top=FFh 
     // OC2 output: Non-Inverted PWM 
     ASSR=0x00; 
     TCCR2=0x6C; 
     TCNT2=0x00; 
     OCR2=0x5F;
     // External Interrupt(s) initialization 
     // INT0: Off 
     // INT1: Off 
     // INT2: Off 
     MCUCR=0x00; 
     MCUCSR=0x00;
     // Timer(s)/Counter(s) Interrupt(s) initialization 
     TIMSK=0x00;
     /// USART initialization 
     // Параметры соединения: 8 Data, 1 Stop, No Parity 
     // USART Receiver: On 
     // USART Transmitter: On 
     // USART Mode: Asynchronous 
     // USART Baud Rate: 38400 
     UCSRA=0x00; 
     UCSRB=0x18; 
     UCSRC=0x86; 
     UBRRH=0x00; 
     UBRRL=0x19;
     // Analog Comparator initialization 
     // Analog Comparator: Off 
     // Analog Comparator Input Capture by Timer/Counter 1: Off 
     ACSR=0x80; 
     SFIOR=0x00;
    while (1) 
     { 
     int a;
     a = 5;
     unsigned char get;
    // Отправить что нибудь:
    printf("%d\n\r", a);
    // Принять
    get = getchar();
    //Отправить принятое:
    printf("%d\n\r", get);
     }
     }

Но не забывайте, прежде чем организовать прием-передачу информации посредством RS232 необходимо согласовать логические уровни. И соединять надо приемник с передатчиком!) Как то так.

READ ALSO
Расстояние между строками. Qt QPainter::drawText

Расстояние между строками. Qt QPainter::drawText

Здравствуйте! Вывожу текст на печать через QPainter::drawTextПодскажите как можно изменить интервал между строками

399
Компиляция программы

Компиляция программы

Есть исходник программы управления устройством через USB (микроконтроллер Attiny45)

287
Java socket: зависает соединение

Java socket: зависает соединение

Пишу код на Java, код прикреплю ниже, там же комментарии в местах, где зависает соединениеПо документации в c =in

354
Форматирование ввода/вывода в С/С++

Форматирование ввода/вывода в С/С++

Стоит такая задача: есть переменная типа int, которую должен ввести пользовательКак поставить защиту "от дурака", т

328