Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART Mega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
zeleboba
Вобщем не могу понять причину глюка..... Передаю 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));
}
//---------------------------------------------------------------------------
Joy
Цитата(zeleboba @ Mar 14 2006, 16:35) *
// ВОБЩЕМ ЕСЛИ ПЕРЕДАВАТЬ buf[3] РАВНЫЙ 0x2A или 0x12A или 0x22A и т д, то возникает глюк
// именно: USART не принимает данный байт, принимает 0й ('*'), принимает 1й (1), принимает 2й, и всё! хотя с другими числами всё работает....всё передаётся и принимается ответ от МК!

Не понял, как это buf[3] может быть равен 0x12A и т.д? Это ж байт!
_artem_
Вы через компютер пытаетесь? Если да то проверьте Xon Xoff flow control на COM порте ? его лучше выключить.

http://msdn.microsoft.com/library/default....msdn_serial.asp
zeleboba
Цитата(Joy @ Mar 14 2006, 18:03) *
Цитата(zeleboba @ Mar 14 2006, 16:35) *

// ВОБЩЕМ ЕСЛИ ПЕРЕДАВАТЬ buf[3] РАВНЫЙ 0x2A или 0x12A или 0x22A и т д, то возникает глюк
// именно: USART не принимает данный байт, принимает 0й ('*'), принимает 1й (1), принимает 2й, и всё! хотя с другими числами всё работает....всё передаётся и принимается ответ от МК!

Не понял, как это buf[3] может быть равен 0x12A и т.д? Это ж байт!


Да... неточно описал....
В buf[2]..buf[3] у меня данные unsigned int соотв-но ст и мл байты... это адрес еепром я передаю в МК, вобщем если buf[2] или
buf[3] = 2Ah = 101010b то всё...стопор! причём если в buf[2] лежит 2Ah то МК читает до него,
т.е 2 первых байта.
Управление потоком в настройках выключено(нет).....

Извинясь за беспокойство )))...... Нашёл я свою проблему..... Чтото я совсем..... Дело в том, что я сам ошибку написал ))
0x2A = коду '*' а я в приёмнике делаю сброс :
if(data == '*')read_cnt = 0
после этого МК думает что начата новая посылка.... Вот так )) ...
prottoss
А пробовали посылать байты в МК сторонним ПО, например RS232 Pro. Надо как то локализироать ошибку, то ли это на РС глюк, то ли на МК, из отрывков кода не разберешь.
zeleboba
Извинясь за беспокойство )))...... Нашёл я свою проблему..... Чтото я совсем..... Дело в том, что я сам ошибку написал ))
0x2A = коду '*' а я в приёмнике делаю сброс :
if(data == '*')read_cnt = 0
после этого МК думает что начата новая посылка.... Вот так )) ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.