Вобщем не могу понять причину глюка..... Передаю 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));
}
//---------------------------------------------------------------------------