[c++]rs232 на atmega8 под FreeBSD - не могу получить ответ
Добавлено: Вт ноя 29, 2011 21:56:17
такая вот беда:
есть устройство(на меге8) с одной стороны
с другой программа, написаная на c++ под FreeBSD
общаются собственно через rs232
Устройство щелкает релюхами, собирает показания с датчиков температуры.
Команды на данные момент типа "aa","bb".
Если подключиться через виндовый HyperTerminal или cu:
cu -l /dev/ttyu0 -s9600
То все работает нормально, МК принимает данные, дрыгает релюхами, отсылает в ответ показания с датчиков.
НО когда запускаешь программу, данные МК принимает(реле щелкает), но в ответ НИЧЕГО получить не могу
- ни букву, которую отсылаю в ответ ни показания - ВООБЩЕ ничего. программа либо ждет бесконечно долго либо ничего не получает.
да, последнее, что выводится на экран "reading data..."
исходник c++:
прошивка:
Подскажите, что не так.
ЗЫ: что-то подсказывает что на стороне компа беда.
ЗЫЫ: гуглил. долго.
есть устройство(на меге8) с одной стороны
с другой программа, написаная на c++ под FreeBSD
общаются собственно через rs232
Устройство щелкает релюхами, собирает показания с датчиков температуры.
Команды на данные момент типа "aa","bb".
Если подключиться через виндовый HyperTerminal или cu:
cu -l /dev/ttyu0 -s9600
То все работает нормально, МК принимает данные, дрыгает релюхами, отсылает в ответ показания с датчиков.
НО когда запускаешь программу, данные МК принимает(реле щелкает), но в ответ НИЧЕГО получить не могу
да, последнее, что выводится на экран "reading data..."
исходник c++:
Код: Выделить всё
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <iostream>
#define MODEMDEVICE "/dev/cuau0"
#define BAUDRATE B9600
int main ()
{
int fd,n;
char buf[255];
fd = open ("/dev/ttyu0",O_RDWR | O_NOCTTY | O_NDELAY);
if (fd<0)
perror("open_port: Unable to open port - ");
else
fcntl(fd, F_SETFL, 0);
std::cout << "writing data...\n";
n = write(fd, "aa", 2);
if (n<0)
std::cout << "write command error\n";
std::cout << "wrote " << n << "bytes\n";
// fcntl(fd, F_SETFL, FNDELAY);
std::cout << "reading data...\n";
n = read(fd,buf,1);
if (n<0)
std::cout << "read command error\n";
else
std::cout << "recivied:["<<buf<<"]";
std::cout << "read conplete\n";
close(fd);
}
Код: Выделить всё
/*лишнее постарался поубирать*/
#define cbi(port,bit) port&=~(1<<bit);
#define sbi(port,bit) port|=(1<<bit);
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
// 1 Wire Bus functions
#include <1wire.h>
// DS1820 Temperature Sensor functions
//#include <ds1820.h>
#include <ds18b20.h>
interrupt [USART_TXC] void usart_tx_isr(void)
{
}
interrupt [USART_DRE] void usart_dre_isr(void)
{
if (uart_start_pointer == uart_end_pointer)
{
uart_tx_buffer_empty=1;
cbi(UCSRB,UDRIE);
#asm("RJMP EXIT_DRE");
}
if (uart_tx_buffer_empty==1)
{
cbi(UCSRB,UDRIE);
#asm("RJMP EXIT_DRE");
}
//не пустой буффер
UDR=uart_buffer[uart_start_pointer++];
#asm("EXIT_DRE:");
}
interrupt [USART_RXC] void usart_rx_isr(void)
{
if (UARTReciviedCommand==0)
UARTReciviedCommand=UDR;
else
{
UARTReciviedData=UDR;
UARTRecivied=1;
}
}
void uart_send(unsigned char byte)
{
#asm
uart_snt:
SBIS UCSRA,UDRE ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE
#endasm
UDR=byte;
}
void UARTClean()
{
UARTReciviedCommand=0;
UARTReciviedData=0;
UARTRecivied=0;
}
void UARTStore(unsigned char data[32], unsigned char size)
{
unsigned char i;
for (i=0;i<size;i++)
{
uart_buffer[uart_end_pointer++]=data[i];
}
uart_tx_buffer_empty=0;
sbi(UCSRB,UDRIE);
}
void main(void)
{
unsigned char ds1820_rom_codes[MAX_DS1820][9];
unsigned char tmp=0,tmp1=0;
unsigned char i=0;
unsigned char devices=0;
PORTB=0x00;
DDRB=1<<0;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=30;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR = 0;
TCCR2 = 4;
TCNT2 = 0;
OCR2 = 25;
MCUCR=0x00;
TIMSK=0x80|0x10;
// 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=1<<RXCIE|1<<TXCIE|1<<RXEN|1<<TXEN;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
w1_init();
devices=w1_search(DS18B20_SEARCH_ROM_CMD,ds1820_rom_codes);
while(1)
{
if (UARTRecivied==1)
{
switch (UARTReciviedCommand)
case 97://a
OnOffL1();
uart_send(UARTReciviedData);
break;
case 98://b
OnOffL2();
uart_send(UARTReciviedData);
break;
case 99://c
OnOffL3();
uart_send(UARTReciviedData);
break;
case 100://d
OnOffL4();
uart_send(UARTReciviedData);
break;
case 101://e
devices=w1_search(DS18B20_SEARCH_ROM_CMD,ds1820_rom_codes);
uart_send(UARTReciviedData);
break;
case 102://f
if (UARTHuman==1)
uart_send(UART_NUMERIC+devices);//количество девайсов
else
uart_send(devices);
break;
case 103://g
if (UARTHuman==1)
{
tmp=ds18b20_temperature(&ds1820_rom_codes[UARTReciviedData-UART_NUMERIC][0]);
sprintf(cTmp,"%+02d",tmp);
UARTStore(cTmp,6);
}
else
{
tmp=ds18b20_temperature(&ds1820_rom_codes[UARTReciviedData][0]);
uart_send(tmp);
}
break;
case 104://h
if (UARTHuman == 0)
UARTHuman=1;
else
UARTHuman=0;
break;
}
UARTClean();
}
}
ЗЫ: что-то подсказывает что на стороне компа беда.
ЗЫЫ: гуглил. долго.