Search the Community
Showing results for tags 'UART'.
Found 74 results
-
Всем добрый день, с толкнулся с такой проблемой , что при написании кода для UART в протеусе симуляция не работает, то есть терминал вылазит, символы печатаю в терминале все отображается, но Микроконтроллер не реагирует на них, пробовал разные коды , с разных сайтов , если открыть готовый проект в протеусе то все работает , создаю свой проект либо исправляю готовый , на нужный мне МК , он перестает , работать , вот один из примеров кода /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Evaluation Automatic Program Generator © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : RS485 Test Version : Date : 15.10.2014 Author : Brain Company : Comments: Chip type : ATmega8515 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> // Standard Input/Output functions #include <stdio.h> char read; // Declare your global variables here void main(void) { DDRA=0xFF; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 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; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; EMCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // SPI initialization // SPI disabled SPCR=0x00; while (1) { // Place your code here read=getchar(); // if( read == 'A') PORTA.0 = 1; if( read == 'B') PORTA.0 = 0; if( read == 'C') PORTA.1 = 1; if( read == 'D') PORTA.1 = 0; if( read == 'E'){ PORTA.1 = 0; PORTA.0 = 1; } } }
-
Здравствуйте. Хочу наладить передачу данных между двумя Arduino Uno через UART. Прошивка рабочая. Плата прошивается. Проблема состоит в следующем, при выключении и включении питания Arduino, не запускается автоматически передача данных. В чем проблема? Заранее спасибо!
-
Хотелось бы в этой теме обсуждать всякие вопросы по асинхронному приемопередатчику UART. И первый вопрос как автор задаю сам. Как принять RXD сигнал (прошивку) на один AVR, записать по i2c в eeprom, спросить разрешения, и если да, то отправить прошивку в другой мк по TXD (BootLoader)?
-
Всем привет, оцените проект, вот схема: А вот видео работы: Файлы протеуса и хекс файл: https://vk.com/doc256435878_327443957
-
Доброго времени суток. Нужна помощь в подключении Raspberry Pi к компьютеру при помощи адаптера USB-TTL. Опыта работы с контроллерами у меня нет. Суть эксперимента: Оборудование Raspberry Pi B Конвертер USB-TTL (маркировка на плате usb-ttl usb-stc-isp, чип PL-2303 XA / HXA) Установленное ПО Raspbian 09-09-2014 PL2303_Prolific_DriverInstaller_v1.10.0 Windows 7 Домашняя Базовая SP1 x64 AMD Действия Подключаю PIN UART <-> Pi GND <-> GND TXD <-> TXD RXD <-> RXD 5V <-> 5V Еще методом научного тыка делал так TXD <-> RXD RXD <-> TXD Подключаю USB, Raspberry Pi работает Запускаю checkChipVersion_v1006.exe из состава программ драйвера. Показывает, что устройство доступно на COM4 Запускаю putty на COM4 скорость 9600. Putty висит в черном экране бесконечно. Проверяю Pi по сети по кабелю. Pi загружена и работает. Ожидания По инструкции putty должен открыть консоль, но этого не происходит. На USB-TTL горит красный светодиод постоянно и в момент подключения к компьютеру 2 секунды мигает еще один. На светодиодах маркировки нет, непонятно что мигает. Вопрос Как проверить Pi и UART по отдельности? Как посмотреть какие байты передаются? Например, с PC подключаюсь, в консоли Pi вижу набор байт полученных по RXD и наоборот. Ну и собственно, почему может не работать? Куда копать? PS. Желающим задать вопросы, а зачем это надо и почему так надо отвечу сразу: (текст для поиска) «Working with GPIO by Using Java ME Embedded and a Raspberry Pi”
-
- Raspberry Pi
- USB-TTL
-
(and 1 more)
Tagged with:
-
Здарова мужики!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! что есть? (дальше больше будет)--> радиомодуль nrf24l01(выбор пал на этот модуль т.к. он с хорошим запасом дальности) mega16(можно и другую мегу) типа кнопки типа диоды типа tft экран (вчера его запилил в мегу ...прикольнее чем 16х2 ...правд жрет много) все в достотачном количестве основная суть то че я хочу сделать вот на этой картинке грубо говоря пахари либо стучат , либо делают че нить полезное батек общается со всеми пахарями (!подчеркиваю их много)через modbus(насколько я понял кто то тут ведомый а кто то ведущий) modbus реализуется не по проводам а по воздуху с помощью nrf24l01 батька крышует opc server ,а общаются они через uart max232 usb ну и если конеш останется время opc server сотрудничает с ментами из scada все это добро будет присоеденено к кому то процессу (может быть) который я тоже выложу со временем в этом топике будет по ходу дела реализоваться вся [криминальная xD ] цепочка сюда будет выкладываться все что я сделал со скринами исходниками и прочее хотел бы повстречать на своем боевом крещении людей которые прошли достаточное количество подводных камней с modbusом uartom usb и тд и тп вообщем все что дальше левой половины пахаря xD и готовые уделить мне немного времени с моими иногда глупыми а ингодна не глупыми воспросами хочу сказать спасибо этому мужику который два года тому назад чему то меня научил в этом топике http://forum.cxem.ne...howtopic=116831 hd44780 спасибо мужик!! ,а это идея с мигающим двоеточием меня вообще убила и я как ее вижу вспоминаю вас gl & hf !
-
Работает ли usart от внутреннего кварца? Прога передача параметра по usart от ПК к МК. Кварц внутренний использовал в tiny 2313 на 8 мГц скорость 9600. Параметр передать не удалось.
-
Подскажите в чём причина. Если одиночный символ передавать ,то всё работает корректно,если послать строку или число, то неправильно вот код void str_uart_send(char *string) { while(*string != '\0') { uart_send(*string); string++; } } void send_int_Uart(unsigned int c)//Отправка числа от 0000 до 9999 по UART { unsigned char temp; c=c%10000; temp=c/100; send_Uart(temp/10+'0'); send_Uart(temp%10+'0'); temp=c%100; send_Uart(temp/10+'0'); send_Uart(temp%10+'0'); }
-
Решил я связать свою atmel8 с компом ,а покупать всякие приспособления не захотел ибо есть arduino почему бы ее не использовать. Взял у своей Atmega8 TX ножку соеденил с RX Arduino UNO Закачал программа на Arduino которая шла в примерах ,слегка изменив. #include <SoftwareSerial.h> SoftwareSerial mySerial(0, 1); // RX, TX void setup() { Serial.begin(14400); Serial.println("Goodnight moon!"); mySerial.begin(9600); } void loop() // run over and over { if (mySerial.available()) { Serial.println(mySerial.read()); } } Связь с компьютером на 14400 бот, работает , а вот как пытаюсь словить с моего atmel8 приходит какой-то бред т.е. оправляю '1' как символ приходит 128 0 0 Вот сама программа что в atmel8 #define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> //Прототипы подпрограмм void USART_Transmit( unsigned char data ); void USART_Init( unsigned int ubrr); void USART_Init( unsigned int ubrr)//Инициализация модуля USART { /* Задаем скорость работы USART 9600 */ UBRRH=0; UBRRL=51; /* Разрешаем прием и передачу по USART */ /* Устанавливаем формат данных 8 бит данных, 2 стоп бита */ UCSRA=0b00000000; UCSRB=0b00011000; UCSRC=0b10000110; } void USART_Transmit( unsigned char data ) //Функция отправки данных { while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема UDR = data; //Начало передачи данных } void send_uart_str(unsigned char *s) { while(*s!=0) USART_Transmit(*s++); } int main(void) { USART_Init (); while(1) { USART_Transmit('1'); } } P/S подключаю только TX-RX а RX-TX нет ибо всё равно мне не нужно что-то отправлять в мк.
-
Здравствуйте. Помогите кто чем может Вобщем есть список комманд, которые передёт программа контроллеру по интерфейсу RS-232. Комманды разной длины. есть 4 байта. есть 6 байт и есть 8 байт. С проверкой комманд, CRC рзобрался, а вот как определить какой длины пришла команда никак не могу На пример делаю проверку по индесу буфера, если индекс = 4 - короткая, если индекс = 6 - длинная, постоянно срабатывает фрагмент индекс = 4.... Кусок кода выкладывать не буду, заранее уверен что он не правильный, если кто поможет буду очень благодарен, а то голову уже сломал )))
-
Всем доброе утро и спасибо за то что хоть глянули топик! Срочно нужна ваша помощь! Собственно проблема - нужно сделать частотомер на авр (Atmega8) и обеспечить передачу данных по UART. Вот то что есть уже у меня: program MAN; var rec,send,setup,cons,start,a,i:integer; var f,freq:longint; var outp,inp:string [23]; label lbl; procedure Compare(); iv IVT_ADDR_TIMER1_COMPA; begin inc(i); if i=1 then begin INT0_bit:=1; TCNT1H:=0x00; TCNT1L:=0x00; DDC1_bit:=1; end else if i=2 then begin TCCR1B:=0; INT0_bit:=0; TCNT1H:=0x00; TCNT1L:=0x00; i:=0; IntToStr(f,outp); UART1_Write_Text(outp); DDC1_bit:=0; f:=0; end; end; procedure int0p(); iv IVT_ADDR_INT0; begin inc(f); end; begin SREG_I_bit:=1; TCCR1B:=0; OCIE1A_bit:=1; OCR1AH:= 0x7a; OCR1AL:= 0x12; ISC00_bit:=1; ISC01_bit:=1; INT0_bit:=0; UART1_Init(600); PINB0_bit:=1; DDC0_bit:=0; DDC1_bit:=0; DDC2_bit:=1; While TRUE do begin if (UART_Data_Ready() = 1) then begin UART1_Read_Text(inp,'/',23); UART1_Write_Text(inp); if strstr(inp,'get') <> 0xFFFF then TCCR1B:=4; end; end; end. Но при запросе с ПК он выдает все что угодно, но не частоту (ресейв переменной сделал специально. что б смотреть не потерялось ли чего). Или напишите структурную схему частотомера (прерывание по int0 или t1). Заранее спасибо!
-
Столкнулся с тем, что в некоторых даташитах на микроконтроллеры в таблицах, где указаны значения для определенных скоростей обмена есть ошибки. Программы для расчета в интеренете не нашел, а калькулятором не очень хотелось пользоваться... Пришлось программу написать свою. За одно добавил расчет значений для выбранной скорости обмена при различных значениях тактовой частоты - теперь удобно определиться с частотой кварца. http://www.vovka.sv19.com/CalcUART
-
Добрый вечер, Уважаемые Форумчане! Битый час боюсь с проблемой: пытаюсь отправить по UART (Atmega32) строку следующего вида: 0x05 0x04 0x00 0x01 0x00 0x10 0x84 0x4D Но вот встала проблема: Значения отправляются, до тех пор, пока не дойдет до 0x00. После этого на выходе uart'a никаких признаков... Пишу на CVAVR. Не отправляется именно нуль и всё, что после него. Если пытаюсь отправить второй раз, то начинает отправляться, и опять встает на этом самом нуле. Пробовал и putsf, и в UDR записывать, но все попытки бесполезны. Ковырял stdio.h, ничего такого не нашел. Менял скорости, тоже бесполезно.
-
Всем привет) Для сигнализации гаража решил реализовать оповещение через телефон. Изучил много статей по AT-командам, по UART... в итоге конкретно и не понял как с МК послать команду в телефон. Пишу на С. Хочется узнать что конкретно писать... на пальцах... Единственно, как я понял, AT-команда отправляется по одному символу... но скорее всего это лишь так кажется мне... Во многих источниках очень сложно написано... такое ощущение что все вокруг великие знатоки ... а как же новички.... :help:
-
Вот хочу сделать опрос кнопок на одном мк отправка по Uart и вывод значения на другом мк. На восемь кнопок я б и сам сделал. Но вот в чем проблема. есть фиксирующийся кнопки и просто нажимные. Не знаю как сделать опрос чтоб сначала с первого мк пришли даные какие фикс. кноп. включены а какие нет, а потом пришли даные про нажатие остальных кнопок. Просто по очереди записывать в РОН и отправлять не работает так как даные после обработки могут пойти не в той порт. вот схема для наглядности Я не прошу чтоб вы за меня весь код написали. Просто дайте мне пинок в спину в нужном направлении.
-
Здраствуйте. Ктонибудь в курсе как работать с uart на низком уровне( ассемблер) в AT89C51 ?
-
Привет,Вот делаю р/у модель и столкнулся с такой проблемой - Мне нужно передавать uart сигнал с пульта на машинку. Посоветуйте готовые модули или подкиньте схемку модуля. Заранее благодарен.
-
Требуеться отсылать данные по UART-у с большой точностью, делаю как по примеру. Схема аналогична примеру //****************************************************************************** // MSP430x47xx Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK // // Description: Echo a received character, RX ISR used. Normal mode is LPM0. // USCI_A0 RX interrupt triggers TX Echo. // Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|01h) // ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz // //* An external watch crystal between XIN & XOUT is required for ACLK *// // // MSP430x47xx // ----------------- // /|\| XIN|- // | | | 32kHz // --|RST XOUT|- // | | // | P2.4/UCA0TXD|------------> // | | 115200 - 8N1 // | P2.5/UCA0RXD|<------------ // // P. Thanigai / K.Venkat // Texas Instruments Inc. // November 2007 // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A //****************************************************************************** #include "msp430x47x4.h" void main(void) { volatile unsigned int i; WDTCTL = WDTPW+WDTHOLD; // Stop WDT FLL_CTL0 |= XCAP14PF; // Configure load caps do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? P2SEL |= BIT4+BIT5; // P2.4,5 = USCI_A0 RXD/TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 0x09; // 1MHz 115200 UCA0BR1 = 0x00; // 1MHz 115200 UCA0MCTL = 0x02; // Modulation UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt _BIS_SR(LPM0_bits + GIE); // Enter LPM0, interrupts enabled } // Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB0RX_VECTOR __interrupt void USCIA0RX_ISR (void) { while(!(IFG2&UCA0TXIFG)); UCA0TXBUF = UCA0RXBUF; // TX -> RXed character } #include "msp430x47x4.h" #include "main.h" extern char Hello_World[] = {"Hello, World!\n\r"}; //Current RSSI as ASCII. void main(void) { WDTCTL = WDTPW+WDTHOLD; // Stop WDT // ================[ Crystal Oscillator ]=============== FLL_CTL0 |= XCAP14PF; // Configure load caps do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? // ===================================================== // ====================[ UART config ]================== //UART1: P4SEL |= BIT0+BIT1; UCA1CTL1 |= UCSSEL_2; UCA1BR0 = 0x09; UCA1BR1 = 0x00; UCA1MCTL = 0x02; UCA1CTL1 &= ~UCSWRST; // UC1IE |= UCA1RXIE; // ===================================================== CCTL0 = CCIE; // CCR0 interrupt enabled TimerChacker = 0; TACCR0 = 62500 - 1; TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // SMCLK, up mode _BIS_SR(LPM0_bits + GIE); // Enter LPM3 } // =============== [ Timer actions ] ================== #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { if (++TimerChacker == 3) { sendToWizFi(Hello_World); TimerChacker = 0; } } // ===================================================== int getLength(unsigned char mess[]){ int j; for (j=0; j<MAX_BUFF; j++){ if ((mess[j] == '\r')) break; } return j; } void sendToUART(unsigned char mess[]){ int maxLen = getLength(mess); for (int j=0; j<=maxLen; j++){ while(!(UC1IFG&UCA1TXIFG)); UCA1TXBUF = mess[j]; } } Что странно, первые пару секунд все без ошибок, а потом начинается этот адок
-
Суть задачи состоит в следующем: необходимо разработать модуля передачи файлов (например сигнала, записанного с микрофона на плате) из USB-флешки (подключенной к плате STM32F4Discovery) по интерфейсу UART. Если кто-то этим занимался или может что-то подсказать, то буду благодарен за любую толковую информацию.
- 3 replies
-
- STM32F4Discovery
- USB
-
(and 2 more)
Tagged with:
-
Привет всем местным! Имеется вот такая схемка: Алгоритм на контроллере простой - принимает два байта данных по UART. Каждый байт подтверждает специальным байтом (не XOn/XOff). На ПК программа аналогичная, только наоборот - посылает два байта по одному и после каждого ожидает подтверждения. Но на ПК программа при чтении из порта говорит, что прочитано 0 байтов и выходит (так и должно быть - в плане выхода, а не нуля байтов). Алгоритм на контроллере: .include "m8def.inc" ; fosc = 8MHz ; Fuse-bits : MSB ... LSB (76543210) ; High byte: 11011111 ; Low byte : 11100100 .def temp = r22 .def temp2 = r18 .def dataTemp = r21 .def driveN = r19 .def stepsN = r20 ; ---------------------------------- ; подтверждение при передаче по uart - C5 .equ UART_ACK = 0b11000101 .def tempBaudRateH = r17 .def tempBaudRateL = r16 .equ DDR_SPI = DDRB .equ DD_SCK = DDB5 .equ DD_MISO = DDB4 .equ DD_MOSI = DDB3 ; uart baudrate coeff .equ uart_baudrate_h = 0b00000000 .equ uart_baudrate_l = 0b00110011 ; zero address rjmp MAIN; ; ------------ MAIN -------------- MAIN: ; configurations block ; сразу же отключаем прерывания cli ; stack init ldi temp, low(RAMEND); ldi temp2, high(RAMEND); out SPH, temp2; out SPL, temp; ; communications configuration rcall ConfigPorts; rcall SPI_MasterInit; rcall UART_Init; main_cycle: ; ожидаем приема от ПК по uart rcall UART_Rcv mov driveN, dataTemp ; номер двигателя ldi dataTemp, UART_ACK rcall UART_Snd nop rcall UART_Rcv mov stepsN, dataTemp ; число шагов mov dataTemp, driveN rcall select_Drive ; ожидаем по времени сколько необходимо для включения SPI на ведомом МК nop; nop; nop; nop; nop; nop; nop; ; передаем число шагов для выполнения mov dataTemp, stepsN rcall SPI_MasterTransmit ; немного ожидания nop; nop; nop; ; отключаем ведомый МК rcall deselect_Drives ; немного выжидаем nop; nop; ; говорим ПК, что мы передали ведомому МК данные ldi dataTemp, UART_ACK rcall UART_Snd rjmp main_cycle; ; ------------------------------- MAIN FINISHED ----------------------------- ; ----------- PROCS ------------ ; configure ports ; In - NONE ; Out - NONE ConfigPorts: ; config drive selector (PORTC) - 0,1,2,3,4,5 - out, 6 - in ldi temp, 0b00111111; out DDRC, temp; ; config (PORTB) - 0, MOSI, SCK, [1, 2 - unsused,for safety] - out, MISO - in. ldi temp, 0b00101111; out DDRB, temp; ; config UART (PORTD) - 1,2,3,4,5,6,7 - out, 0 - in ldi temp, 0b11111110; out DDRD, temp; ; globaly disable interrupts cli; ret ; allow SPI ; In - NONE ; Out - NONE SPI_MasterInit: ; Set MOSI and SCK direction to output, all others are set to input ldi temp, (1<<DD_MOSI)|(1<<DD_SCK) out DDR_SPI,temp ; Enable SPI, Master, set clock rate fck/4 ldi temp, (1<<SPE)|(1<<MSTR) out SPCR, temp ; Double the clock rate! up to fck/2 ; sbi SPSR, SPI2X ret ; SPI tranmition as master ; In - dataTemp - byte to be tranmitted ; Out - NONE SPI_MasterTransmit: ; Start transmission of data (r16) out SPDR, dataTemp Wait_Transmit: ; Wait for transmission complete sbis SPSR,SPIF rjmp Wait_Transmit ret ; UART initialization @ 9600 bps ; In - NONE ; Out - NONE UART_Init: ; setting baudrate ldi tempBaudRateH, uart_baudrate_h ldi tempBaudRateL, uart_baudrate_l out UBRRH, tempBaudRateH out UBRRL, tempBaudRateL ; Enable reciever and transmitter ldi dataTemp, (1<<RXEN)|(1<<TXEN) out UCSRB, dataTemp ; setting frame format: 8data bits, 2 stop bits ldi dataTemp, (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0) out UCSRC, dataTemp ret ; UART recieve proc ; In - NONE ; Out - dataTemp - recieved byte UART_Rcv: sbis UCSRA, RXC rjmp UART_Rcv in dataTemp, UDR ret ; UART send proc ; In - dataTemp - byte to be transmitted over UART ; Out - NONE UART_Snd: sbis UCSRA, UDRE rjmp UART_Snd CheckFinishPrevSnd: sbis UCSRA, TXC rjmp CheckFinishPrevSnd out UDR, dataTemp ret ; select drive ; In - dataTemp - drive to select ; Out - NONE select_Drive: andi dataTemp, 0b00000111 ori dataTemp, 0b00001000 out PORTC, dataTemp nop; nop; ret ; deselect drives ; In - NONE ; Out - dataTemp = 0 deselect_Drives: clr dataTemp ori dataTemp, 0b00110000 out PORTC, dataTemp nop; nop; ret На ПК программа выглядит так: //#include <stdafx.h> #include <Windows.h> #include <stdio.h> #include <windows.h> // ?? #define RDWR_BUFSZ 1 #define NDRIVES_MASK 0x07 #define DIR_MASK 0x01 #define DIR_POSITION 0x03 #define NSTEPS_MASK 0x7f #define ONE_BYTE 0xff #define uart_ack 0xc5 void Recv (HANDLE, unsigned char *); void Send (HANDLE, unsigned char *); int main(int argc, char* argv[]) { char file_name[256]; wchar_t wFlName[256]; LPCWSTR flName; HANDLE hSerial; DCB dcbSerialParams = {0}; COMMTIMEOUTS timeouts = {0xFFFFFFFF,0,0,0,1500}; unsigned int DriveN; unsigned int Nsteps; unsigned int Direction; unsigned int GotSmth; wchar_t lastError[1024]; unsigned char drvN, Nst, rslt; const WCHAR FileFullPath[] = {L"COM1"}; printf("Type in COM-port name. "); wscanf(L"%s", wFlName); //swprintf(wFlName, L"%s", file_name); printf("port - %s\n", wFlName); /** Начало. открытие порта. настройка **/ hSerial = CreateFile (FileFullPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial == INVALID_HANDLE_VALUE) { printf(" Can't open port.\n"); system("pause"); ExitProcess(1); }; // Конфигурирования dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { printf(" Can't get port parameters\n"); CloseHandle(hSerial); ExitProcess(1); }; dcbSerialParams.BaudRate = CBR_9600; dcbSerialParams.fBinary = true; dcbSerialParams.fParity = NOPARITY; // False dcbSerialParams.fOutxCtsFlow = false; // no flow control by hardware (CTS) dcbSerialParams.fDtrControl = DTR_CONTROL_DISABLE; // no handshaking dcbSerialParams.fDsrSensitivity = false; // no look at DSR dcbSerialParams.fOutX = false; // no software flow control (Xon/Xoff) on Tx dcbSerialParams.fInX = false; // no software flow control (Xon/Xoff) on Rx dcbSerialParams.fErrorChar = false; // don't change error chars (checked by parity if it is True) dcbSerialParams.fNull = false; // we'll take even NULL characters dcbSerialParams.fRtsControl = RTS_CONTROL_DISABLE; // no flow control by hardware (RTS) // 8 битов данных, без бита четности, два стоповых бита dcbSerialParams.ByteSize = 8; dcbSerialParams.Parity = NOPARITY; dcbSerialParams.StopBits = TWOSTOPBITS; if(!SetCommState(hSerial, &dcbSerialParams)){ printf(" Can't set port parameters.\n"); CloseHandle(hSerial); system("pause"); ExitProcess(1); }; // время ожидания /* timeouts.ReadIntervalTimeout=50; timeouts.ReadTotalTimeoutConstant=50; timeouts.ReadTotalTimeoutMultiplier=10; timeouts.WriteTotalTimeoutConstant=50; timeouts.WriteTotalTimeoutMultiplier=10; */ if(!SetCommTimeouts(hSerial, &timeouts)){ printf(" Can't set port timeout.\n"); CloseHandle(hSerial); ExitProcess(1); }; do { printf("Type in drive No (0..7, 8 - exit) - "); scanf("%u", &DriveN); if (DriveN == 8) break; DriveN &= NDRIVES_MASK; printf("Number of halfsteps (0..127, 128 - exit) - "); scanf("%u", &Nsteps); if (Nsteps == 128) break; Nsteps &= NSTEPS_MASK; printf("Direction (1 - to there, 0 - from there) - "); scanf("%u", &Direction); Direction &= DIR_MASK; Direction <<= DIR_POSITION; Nsteps = Nsteps | Direction; drvN = DriveN & ONE_BYTE; printf(" Drive number is ready to be sent - %x\n", drvN); Send(hSerial, &drvN); Recv(hSerial, &rslt); if (rslt != uart_ack) { printf(" Wrong acknowledge got - %x\n", rslt); break; }; Nst = Nsteps & ONE_BYTE; printf(" Command is ready to be sent - %x\n", Nst); Send(hSerial, &Nst); Recv(hSerial, &rslt); if (rslt != uart_ack) { printf(" Wrong acknowledge - %x\n", rslt); break; }; } while (true); /** Конец. **/ CloseHandle(hSerial); system("pause"); return 0; } void Recv (HANDLE hSerial, unsigned char *szBuff) { DWORD dwBytesRW = 0; int RdWrResult; DWORD i; wchar_t lastError[1024]; // чтение RdWrResult = ReadFile(hSerial, szBuff, RDWR_BUFSZ, &dwBytesRW, NULL); printf(" Number of bytes read - %u\n", dwBytesRW); printf(" Data read - "); for (i = 0; i < dwBytesRW; i ++) { printf("%x ", szBuff[i]); }; printf("\n"); if(!RdWrResult){ printf("Fail on recieve.\n"); CloseHandle(hSerial); system("pause"); ExitProcess(1); } } void Send (HANDLE hSerial, unsigned char *szBuff) { DWORD dwBytesRW = 0; int RdWrResult; DWORD i; wchar_t lastError[1024]; // запись RdWrResult = WriteFile(hSerial, szBuff, RDWR_BUFSZ, &dwBytesRW, NULL); printf(" Number of bytes writen - %u\n", dwBytesRW); printf(" Data writen - "); for (i = 0; i < dwBytesRW; i ++) { printf("%x ", szBuff[i]); }; printf("\n"); if(!RdWrResult || dwBytesRW != RDWR_BUFSZ) { printf("Fail on send.\n"); CloseHandle(hSerial); system("pause"); ExitProcess(1); } } Связь настроена на формат 8N2. Помогите советом или хотя бы направлением на поиск. Еще вопрос небольшой. Хотелось бы мигалки впендюрить на линии RX и TX на MAX232. Что бы наблюдать есть ли вообще передача.
-
Здравствуйте, пытаюсь установить связь между микроконтроллером (плата STM32F4DISCOVERY) и радиомодемом, управляемым АТ командами. Подключение к радиомодему осуществляется посредством rs232. Подключая ПК к модему всё работает, т.е. корректно отправляются команды и приходят ответы. Подключая МК к ПК связь есть, т.е. UART на МК рабочий. Подключая МК к модему связи нет - устройство не отвечает на команды. Сопряжение МК с модемом и с ПК осушествляю при помощи стандартной схему rs232-uart на max232. Прикрепляю фотографии экрана осциллографа (V/дел. = 5), ловил сигнал на TX линии: 1. МК подключен к ПК и МК высылает сообщения. Терминальная программа на ПК корректно получает высылаемые сообщения. 2. МК всё еще подключен к ПК + землю и ТX подключил к модему. Высылаемые сообщения больше не доходят до ПК. Может кто-нибудь сталкивался с подобным или может что-либо посоветовать?
-
Возникла небольшая пробемка с получением микроокнтроллером значения, получаемого с UART. В UART передается строка вида: F6, т.е. шестнадцатиричное значение. Т.е. получается 2 байта F и 6. В микроконтроллере, мне необходимо принять эти данные и получить переменную с шестнадцатиричным значением т.е. например int c = 0xF6; Данные я принял, получив массив char UD[2] = {'F','6'}, а как мне их теперь "склеить" и получить 0xF6 не сображу
-
Уважаемые профи! подскажите как подключить простые китайские весы к компьютеру, чтобы можно было выводить данные на экран. Подскажите! поделитесь схемой. Можно ли с дисплея выводить данные? Я в этом деле человек новый, но решение данной задачи очень нужно. Вот такие весы!