avr Си как отправить <STX><NUL><SOH>SR

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Чт июл 21, 2022 15:37:28

Сообщение azerhud »

Здравствуйте. Мне нужно отправить на устройство команду в виде <STX><NUL><SOH>SR и принять ответ, но не знаю можно ли средствами AVR Си осуществить данную процедуру. Может кто то хоть примерно объяснит как это делается. Поиски по интернету не дали желаемого результата.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Ну а почему нельзя? Можно. У всех ASCII-символьных команд есть свои числовые коды https://www.industrialnets.ru/files/mis ... t846192500
Отправьте байты 0x02, 0x00, 0x01, 0x0D (имели ввиду наверняка CR, а не SR ).
Ответ придет так же в виде байтов в символьном ANSII-виде. По таблице переведете их.
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Чт июл 21, 2022 15:37:28

Сообщение azerhud »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4276957#p4276957"](имели ввиду наверняка CR, а не SR ).[/uquote]

Здравствуйте. Нет, там именно SR. По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить <STX><NUL><SOH>SR а затем получить ответ через MAX490 с устройством
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

[uquote="azerhud",url="/forum/viewtopic.php?p=4277055#p4277055"]По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить[/uquote]
Угадал все буквы, не смог назвать слово (с) Поле чудес
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 16756
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

[uquote="azerhud",url="/forum/viewtopic.php?p=4277055#p4277055"][uquote="MLX90640",url="/forum/viewtopic.php?p=4276957#p4276957"](имели ввиду наверняка CR, а не SR ).[/uquote]

Здравствуйте. Нет, там именно SR. По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить <STX><NUL><SOH>SR а затем получить ответ через MAX490 с устройством[/uquote]
SR - это, видимо, просто буквы? Ибо не заключены в угловые скобки, как другие спецсимволы. Ну так 'S' == 0x53, 'R' == 0x52.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Наверно да, просто символы S и R. Хотя символ конца строки должен присутствовать в конце передачи строки в ASCII-кодированных протоколах связи, кагбе вот. Обычно это два символа <CR><LF>, но может быть и один из них.

Как отправить символы - уже же объяснил. (сегодня день какой-то странный, люди несколько необычные попадаются тут). Табличку дал с кодами. Ищите в табличке символ, ищите его числовой код в десятичном ИЛИ шестнадцатеричном представлении, ну и отправляете это число. Читайте или ищите готовые скетчи для UART для адруины.
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

да, теоретически, надо бы у ТС спросить, что за устройство он там мучает, да документацию на него... "но я уже в пижаме..." (с) Фарнсворт
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Чт июл 21, 2022 15:37:28

Сообщение azerhud »

Пока пытаюсь отправить только <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 секунду.
        
    }
}
Изображение
Друг Кота
Аватара пользователя
Сообщения: 16756
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Смотреть осциллографом, проверять все биты. Возможно, формируется бит чётности. Также проверить время, занимаемое каждым битом, нет ли ошибки в их определении из-за несовпадения частот. Явно D7 = 1 в каждом байте, в то время как должно быть 0.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Чт июл 21, 2022 15:37:28

Сообщение azerhud »

И снова всем Здравия. изменил программу

Код: Выделить всё

// Функция передачи данных по 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.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Блин, ну зачем вы текстом то отправляете STX как три символа то? STX - это ОДИН, блин, символ, причем, служебный символ, КОД которого равен 2 в десятичной системе. И на приемной стороне получите код 2, потому как это НЕ текстовый символ, а наоборот, служебный маркер, именуемый Start Of Text, использовался в прошлом тысячелетии в примитивных линиях связи. А ваша терминалка просто выводит КОД этого маркера, поскольку не имеет никакого графического символа для его отображения в окне терминалки.
И кстати, у вас там чето всё наоборот переставлено. Вначале должен идти символ SOH (Start Of Heading), затем символы заголовка, затем SOT (Start Of Text), который является признаком завершения заголовка и начала текста, затем сам текст, и потом ETX (End Of Text). Как бы вот.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Чт июл 21, 2022 15:37:28

Сообщение azerhud »

По протоколу опрос устройства осуществляется через циклически <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> и исходя из этого мне нужно запустить соответствующее действие. То есть еще придётся как то расшифрововать принятые символы :( :(.....
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Расшифровка принятых ответов называется разбором строки, или по-басурмански, парсинг.
Вначале запишите на бумажке все возможные ответы, разберитесь в них, что есть что, где параметры, где определяющий их текст, как выглядят, на каких местах что стоит. Ну и... ну и, в общем случае, разбор строки делается при помощи оператора switch и набора вариантов case. Числовые символы, если они являются параметром, преобразуются из текстовой строки в бинарный вид с помощью встроенной функции языка Си atoi() или atof(). Почитайте в инете материалы по теме парсинга сообщений с уарта. Посмотрите примеры разбора ответов от модуля SIM800 или какого-нибудь GPS-модуля.
Ответить

Вернуться в «Теория»