Вобщем не могу понять причину глюка..... Передаю 4 байта контроллеру, получаю ответ от МК:
RX_BUFFER_SIZE 4
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; unsigned int addr; int temp;
status=UCSRA; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { data=UDR; if(data == '*')read_cnt = 0; // synh; любая моя передача начинается с '*' и имеет длину 4 байта rx_buffer[read_cnt]=data; read_cnt++; if(read_cnt == RX_BUFFER_SIZE) { read_cnt = 0; if(rx_buffer[0] == '*') { switch (rx_buffer[1]){ case 1: addr = rx_buffer[2]; addr = (addr << 8)|rx_buffer[3]; putchar('*'); putchar(1); data = read_byte_eeprom(addr); putchar(data); data = read_byte_eeprom(addr+1); putchar(data); break; ....... } .... } } }
Вот примерный кусок передающей программы (код инициализации порта не привожу):
void __fastcall TMainForm::Button1Click(TObject *Sender) { char buf[4]; DWORD i; int temp; buf[0] = '*'; // начало посылки buf[1] = 1; buf[2] = 0; buf[3] = 42; // ГЛЮКККККК WriteFile(port_ptr, &buf, 4, &i, NULL); ReadFile(port_ptr, &buf, 4, &i, NULL); // ВОБЩЕМ ЕСЛИ ПЕРЕДАВАТЬ buf[3] РАВНЫЙ 0x2A или 0x12A или 0x22A и т д, то возникает глюк // именно: USART не принимает данный байт, принимает 0й ('*'), принимает 1й (1), принимает 2й, и всё! хотя с другими числами всё работает....всё передаётся и принимается ответ от МК! temp = (buf[2]); temp = temp << 8; temp = temp | (buf[3]); ShowMessage(IntToStr(i)); if(i !=0)ShowMessage(IntToStr(temp/10)+"."+IntToStr(temp%10)); } //---------------------------------------------------------------------------
|