Komunikuję się z kamerką mca-25 za pomocą sprzętowego rs 232. Kwarc taktujący to 14.318180MHz. Wszystko działa dopóki nie zmienię prędkości transmisji z 19200b/s na 460800 bodów - po prostu tak jakby złą prędkość ustawiał. Nie otrzymuję odpowiedzi od kamerki. Macie może pomysł, czemu to nie trybi? Oto kod:
Reszta funkcji działa dobrze, także myślę, że nie ma sensu szukać w nich błędu, ale jeśli ktoś chce to proszę:
int main()
{
USART_init(baud(19200)); // #define baud(x) (F_CPU/(16UL*(x)))-1
DDRB=GRNLED;
DDRD=1 << PORTD2;
PORTD=0;
HIB(GRNLED);
_delay_ms(500);
LOB(GRNLED);
PORTD=1 << PORTD2; //włączenie kamerki
w84data("AT&F"); //oczekuj na komendę inicjującą od kamery
senddata("\r\nOK\r\n");
w84data("AT+IPR=?\r");
senddata("+IPR: (),(460800)\r\n\r\nOK\r\n");
w84data("800\r");
senddata("\r\nOK\r\n"); // do tego fragmentu dochodzi jeszcze
USART_init(1); // (141318180/(16*460800))-1 == 0.9420 == ~1
w84data("AT+CMUX=?"); //nie otrzymuję niczego takiego
senddata("\r\n+CMUX: (0)\r");
senddata("\r\nOK\r\n");
w84data("AT+CMUX=0,0,7,31");
senddata("\r\nOK\r\n");
return 0;
}Reszta funkcji działa dobrze, także myślę, że nie ma sensu szukać w nich błędu, ale jeśli ktoś chce to proszę:
void USART_init(int baudrate)
{
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char)baudrate;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (3 << UCSZ0);
}
unsigned char USART_receive()
{
while (!(UCSRA & (1 << RXC)));
return UDR;
}
void USART_transmit(unsigned char chr)
{
while(!(UCSRA & (1 << UDRE)));
UDR=chr;
}
int strlen(const char* src)
{
int i;
for (i=0;src[i];i++);
return i;
}
void w84data(const char* cmpwith)
{
int cmppos=0;
int cmpsize=strlen(cmpwith);
unsigned char rcv;
do
{
rcv=USART_receive();
if (rcv==cmpwith[cmppos])
cmppos++;
else
cmppos=0;
}while(cmppos < cmpsize);
}
void senddata(const char* tosend)
{
int i;
for (i=0;tosend[i];i++)
USART_transmit(tosend[i]);
}