Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее
Вт авг 23, 2022 07:21:19
Здравствуйте. Мне нужно отправить на устройство команду в виде <STX><NUL><SOH>SR и принять ответ, но не знаю можно ли средствами AVR Си осуществить данную процедуру. Может кто то хоть примерно объяснит как это делается. Поиски по интернету не дали желаемого результата.
Вт авг 23, 2022 08:01:04
Ну а почему нельзя? Можно. У всех ASCII-символьных команд есть свои числовые коды
https://www.industrialnets.ru/files/mis ... t846192500Отправьте байты 0x02, 0x00, 0x01, 0x0D (имели ввиду наверняка CR, а не SR ).
Ответ придет так же в виде байтов в символьном ANSII-виде. По таблице переведете их.
Вт авг 23, 2022 11:15:49
(имели ввиду наверняка CR, а не SR ).
Здравствуйте. Нет, там именно SR. По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить <STX><NUL><SOH>SR а затем получить ответ через MAX490 с устройством
Вт авг 23, 2022 11:23:14
По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить
Угадал все буквы, не смог назвать слово (с) Поле чудес
Вт авг 23, 2022 12:35:41
(имели ввиду наверняка CR, а не SR ).
Здравствуйте. Нет, там именно SR. По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить <STX><NUL><SOH>SR а затем получить ответ через MAX490 с устройством
SR - это, видимо, просто буквы? Ибо не заключены в угловые скобки, как другие спецсимволы. Ну так 'S' == 0x53, 'R' == 0x52.
Вт авг 23, 2022 13:45:56
Наверно да, просто символы S и R. Хотя символ конца строки должен присутствовать в конце передачи строки в ASCII-кодированных протоколах связи, кагбе вот. Обычно это два символа <CR><LF>, но может быть и один из них.
Как отправить символы - уже же объяснил. (сегодня день какой-то странный, люди несколько необычные попадаются тут). Табличку дал с кодами. Ищите в табличке символ, ищите его числовой код в десятичном ИЛИ шестнадцатеричном представлении, ну и отправляете это число. Читайте или ищите готовые скетчи для UART для адруины.
Вт авг 23, 2022 13:54:57
да, теоретически, надо бы у ТС спросить, что за устройство он там мучает, да документацию на него... "но я уже в пижаме..." (с) Фарнсворт
Ср авг 24, 2022 09:48:39
Пока пытаюсь отправить только <STX><NUL><SOH>SR через небольшую программку.
Как одновременно отправить эту конструкцию так и не понял. Решил в шестнадцеричном виде. Но в терминале совсем другой результат.
- Код:
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL
int main(void)
{ //отправить <STX><NUL><SOH>SR
char out[] = {0x02,0x00,0x01,0x53,0x52};
int i=0;
UCSRA = 0x00;
UCSRB = 0x08;
UCSRC = 0x86;
UBRRH = 0x00;
UBRRL = 0x2F;
while(1)
{
while(!( UCSRA & (1<<UDRE)));
UDR = out[i]; // Отправляем текущее значение в порт
i++; // Увеличиваем текущее значение на 1
if(i>4) i=0;
_delay_ms(1000); // Делаем паузу на 1 секунду.
}
}
Ср авг 24, 2022 15:48:22
Смотреть осциллографом, проверять все биты. Возможно, формируется бит чётности. Также проверить время, занимаемое каждым битом, нет ли ошибки в их определении из-за несовпадения частот. Явно D7 = 1 в каждом байте, в то время как должно быть 0.
Пт сен 09, 2022 14:38:17
И снова всем Здравия. изменил программу
- Код:
// Функция передачи данных по USART
void uart_send(char data)
{
while(!( UCSRA & (1 << UDRE))); // Ожидаем когда очистится буфер передачи
UDR = data; // Помещаем данные в буфер, начинаем передачу
}
// Функция передачи строки по USART
void str_uart_send(char *string)
{
while(*string != '\0')
{
uart_send(*string);
string++;
}
}
при отправке
uart_send(0x02);на приёмной стороне получаю 02.
Но при отправке
str_uart_send("STX");Получаю в ASCII STX, а в HEX вместо 02 получаю 53, 54 и 58.
Как я понял, получается так, что передаются символы ascii-кодировке, а мне нужно передать это как конкретное число, которое можно поместить в регистр.
То есть в ASCII команда STX будет 02. Но в моём случаи при передаче получается что я отправляю не 02 а набор из 53, 54 и 58.
Пт сен 09, 2022 15:38:19
Блин, ну зачем вы текстом то отправляете STX как три символа то? STX - это ОДИН, блин, символ, причем, служебный символ, КОД которого равен 2 в десятичной системе. И на приемной стороне получите код 2, потому как это НЕ текстовый символ, а наоборот, служебный маркер, именуемый Start Of Text, использовался в прошлом тысячелетии в примитивных линиях связи. А ваша терминалка просто выводит КОД этого маркера, поскольку не имеет никакого графического символа для его отображения в окне терминалки.
И кстати, у вас там чето всё наоборот переставлено. Вначале должен идти символ SOH (Start Of Heading), затем символы заголовка, затем SOT (Start Of Text), который является признаком завершения заголовка и начала текста, затем сам текст, и потом ETX (End Of Text). Как бы вот.
Пт сен 09, 2022 16:01:57
По протоколу опрос устройства осуществляется через циклически <STX><NUL><SOH>SR, на что устройство мне отвечает <STX><NUL><SOH>S10S - если он свободен.
Через программу Terminal1_9_b при отправке $02$00$01$53$52 проблем нет, ответ я получаю.
С контроллера отправляю
- Код:
char d[]= {0x02, 0x00, 0x01, 0x53, 0x52};
.....
for(b; b<4; b++)
{
uart_send(d[b]); // Передаем символы <STX><NUL><SOH>SR по USART
}
......
тоже проблем нет. Но мне в зависимости от ответа нужно передавать определенный вид команды и принимать соответствующий ответ. А писать к каждому ответу свой массив, мне кажется, не правильно. Вот и не могу додуматься.
К примеру ответы могут быть <STX><NUL><SOH>S41W или <STX><NUL><SOH>S61U или <STX><NUL><SOH>L1i6;000010<EM> и исходя из этого мне нужно запустить соответствующее действие. То есть еще придётся как то расшифрововать принятые символы
.....
Пт сен 09, 2022 16:34:45
Расшифровка принятых ответов называется разбором строки, или по-басурмански, парсинг.
Вначале запишите на бумажке все возможные ответы, разберитесь в них, что есть что, где параметры, где определяющий их текст, как выглядят, на каких местах что стоит. Ну и... ну и, в общем случае, разбор строки делается при помощи оператора switch и набора вариантов case. Числовые символы, если они являются параметром, преобразуются из текстовой строки в бинарный вид с помощью встроенной функции языка Си atoi() или atof(). Почитайте в инете материалы по теме парсинга сообщений с уарта. Посмотрите примеры разбора ответов от модуля SIM800 или какого-нибудь GPS-модуля.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.