реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> USART Mega8, не могу принять
zeleboba
сообщение Mar 14 2006, 14:35
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-02-06
Из: Сибирь - г.Барнаул
Пользователь №: 13 892



Вобщем не могу понять причину глюка..... Передаю 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));
}
//---------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post
Joy
сообщение Mar 14 2006, 15:03
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 28-10-05
Из: Киев
Пользователь №: 10 227



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

Не понял, как это buf[3] может быть равен 0x12A и т.д? Это ж байт!
Go to the top of the page
 
+Quote Post
_artem_
сообщение Mar 14 2006, 15:05
Сообщение #3


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Вы через компютер пытаетесь? Если да то проверьте Xon Xoff flow control на COM порте ? его лучше выключить.

http://msdn.microsoft.com/library/default....msdn_serial.asp

Сообщение отредактировал _artem_ - Mar 14 2006, 15:08


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
zeleboba
сообщение Mar 14 2006, 16:28
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-02-06
Из: Сибирь - г.Барнаул
Пользователь №: 13 892



Цитата(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
после этого МК думает что начата новая посылка.... Вот так )) ...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 14 2006, 16:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



А пробовали посылать байты в МК сторонним ПО, например RS232 Pro. Надо как то локализироать ошибку, то ли это на РС глюк, то ли на МК, из отрывков кода не разберешь.


--------------------
Go to the top of the page
 
+Quote Post
zeleboba
сообщение Mar 14 2006, 17:38
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-02-06
Из: Сибирь - г.Барнаул
Пользователь №: 13 892



Извинясь за беспокойство )))...... Нашёл я свою проблему..... Чтото я совсем..... Дело в том, что я сам ошибку написал ))
0x2A = коду '*' а я в приёмнике делаю сброс :
if(data == '*')read_cnt = 0
после этого МК думает что начата новая посылка.... Вот так )) ...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 01:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016