Есть PIC16F84 (без встроенной поддержки RS232), на плате в разъёме DB9 распаяны только RD, TD (на порты микроконтроллера) и SG (соответственно, на землю) Можно ли в таких условиях хоть как-нибудь общаться с девайсом? В идеале, через CreateFileA....
можно, только скорость порта будет сильно ограничена. X~=F/T X-скорость порта F-тактовая частота микроконтроллера (вроде 4MHz для PIC16F84) T-количество тактов на выполнение кода отправки бита.) с приемом аналогично. относительно удобно прикрутить RD на вход прерывания и мерить интервал между переходами 1->0. не забудь поставить преобразователь уровней (типа ADM202) между микроконтроллером и RS-232 еще можно замкнуть в RS-232 CTS и RTS иначе терминалка может подумать что ничего отправлять не надо тк устройство не готово.
"Loopback plug" - это оно? http://www.beyondlogic.org/serial/loopback.gif Т.е. Windows-приложение при вызове ReadFile получит 8 битов, снятых с "TD" девайса с промежутком 1/X (X - выставленная скорость COM-порта) ?
ага оно. только RD и TD не между собой соединиить а к микроконтроллеру. а вообще лучше забить на PIC и юзать какой нибудь простенький AVR (attiny2313) это дешевле зато 20Mhz, никакого гемороя с банками пеамяти и встроенный UART. вообще пока не встречал ситуацию где PIC лучше AVR.
Если не очень хочется со всем этим возиться и нет времени пересаживаться на другие МК, можно взять PIC16F628. Он максимально схож pin-2-pin с PIC16F84, но при этом обладает дополнительной функциональностью и... если я не ошибаюсь, он дешевле.
Если кому интересно... Всё оказалось очень просто. Порт настраивается на требуемую скорость, весь контроль выключается: Код (Text): DCB dcb; memset(&dcb, 0, sizeof(dcb)); dcb.BaudRate = CBR_110; dcb.ByteSize = 8; dcb.DCBlength = sizeof(DCB); dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fBinary = 1; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; Затем, для приёма или передачи: В неактивном состоянии на линии RD или TD должен стоять 1 (стоп-бит) затем передаётся один нулевой бит (старт-бит) и 8 бит данных. Длина бита вычисляется из скорости канала. Код для PIC16F84A (20 MHz): Код (Text): sleep45: ; sleeps for 4.5 ms - half bit length (1000 ms / 110 bod / 2) movlw 0x1D movwf sleep_r1 sleep45_1: clrf sleep_r2 sleep45_2: decfsz sleep_r2 goto sleep45_2 decfsz sleep_r1 goto sleep45_1 return ;sends one byte from comm_reg sendbyte: ; sending start-bit bcf PORTB, 2 call sleep45 call sleep45 bsf STATUS, C ;we need to send 8 data bits AND stop-bit, which is now loaded to C sendbyte_1l: rrf comm_reg btfss STATUS, C bcf PORTB, 2 btfsc STATUS, C bsf PORTB, 2 call sleep45 call sleep45 clrw addwf comm_reg, w ;CF = 0, ZF = (commreg==0) btfss STATUS, Z ;comm_reg=0 means we've done! goto sendbyte_1l return ; receives one byte to comm_reg recvbyte: btfsc PORTB, 1 ; waiting for startbit (0) goto recvbyte call sleep45 call sleep45 ;first data bit starts here movlw 0x80 ; we're putting '1' to bit7. it will appear in CF after 8 shifts movwf comm_reg recvbyte_l1: call sleep45 ;skeeping halfbit bcf STATUS, C btfsc PORTB, 1 ; CF = PORTB1 bsf STATUS, C rrf comm_reg btfsc STATUS, C ;if initial '0x01' in CF now then we've done goto recvbyte_exit call sleep45 ;skeeping second halfbit goto recvbyte_l1 recvbyte_exit: call sleep45 ;second half of last bit call sleep45 ;stopbit call sleep45 return
замечательно. только в процессе передачи (и приема тоже) процессор будет заниматься только этим (большую часть времени в функции sleep45). причем прерывания тоже придется запретить ато будут ошибки при передаче. логичнее сделать как раз код отправки очередного бита в обработчике прерывания от таймера. тогда все остальное будет работать независимо.
kropalik Логичней и красивее, но сложнее, а мне требуется только простое взаимодействие вопрос-ответ. Не стоит вкладывать слишком много сил в курсовой проект, ибо всё равно никто это не оценит