Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить

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

Вт авг 23, 2022 07:21:19

Здравствуйте. Мне нужно отправить на устройство команду в виде <STX><NUL><SOH>SR и принять ответ, но не знаю можно ли средствами AVR Си осуществить данную процедуру. Может кто то хоть примерно объяснит как это делается. Поиски по интернету не дали желаемого результата.

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

Вт авг 23, 2022 08:01:04

Ну а почему нельзя? Можно. У всех ASCII-символьных команд есть свои числовые коды https://www.industrialnets.ru/files/mis ... t846192500
Отправьте байты 0x02, 0x00, 0x01, 0x0D (имели ввиду наверняка CR, а не SR ).
Ответ придет так же в виде байтов в символьном ANSII-виде. По таблице переведете их.

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

Вт авг 23, 2022 11:15:49

(имели ввиду наверняка CR, а не SR ).


Здравствуйте. Нет, там именно SR. По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить <STX><NUL><SOH>SR а затем получить ответ через MAX490 с устройством

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

Вт авг 23, 2022 11:23:14

По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить

Угадал все буквы, не смог назвать слово (с) Поле чудес

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

Вт авг 23, 2022 12:35:41

(имели ввиду наверняка CR, а не SR ).


Здравствуйте. Нет, там именно SR. По USART я научился отправлять символы. Но в данный момент я не могу сообразить как отправить <STX><NUL><SOH>SR а затем получить ответ через MAX490 с устройством

SR - это, видимо, просто буквы? Ибо не заключены в угловые скобки, как другие спецсимволы. Ну так 'S' == 0x53, 'R' == 0x52.

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

Вт авг 23, 2022 13:45:56

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

Как отправить символы - уже же объяснил. (сегодня день какой-то странный, люди несколько необычные попадаются тут). Табличку дал с кодами. Ищите в табличке символ, ищите его числовой код в десятичном ИЛИ шестнадцатеричном представлении, ну и отправляете это число. Читайте или ищите готовые скетчи для UART для адруины.

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

Вт авг 23, 2022 13:54:57

да, теоретически, надо бы у ТС спросить, что за устройство он там мучает, да документацию на него... "но я уже в пижаме..." (с) Фарнсворт

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

Ср авг 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 секунду.
       
    }
}


Изображение

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

Ср авг 24, 2022 15:48:22

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

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

Пт сен 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.

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

Пт сен 09, 2022 15:38:19

Блин, ну зачем вы текстом то отправляете STX как три символа то? STX - это ОДИН, блин, символ, причем, служебный символ, КОД которого равен 2 в десятичной системе. И на приемной стороне получите код 2, потому как это НЕ текстовый символ, а наоборот, служебный маркер, именуемый Start Of Text, использовался в прошлом тысячелетии в примитивных линиях связи. А ваша терминалка просто выводит КОД этого маркера, поскольку не имеет никакого графического символа для его отображения в окне терминалки.
И кстати, у вас там чето всё наоборот переставлено. Вначале должен идти символ SOH (Start Of Heading), затем символы заголовка, затем SOT (Start Of Text), который является признаком завершения заголовка и начала текста, затем сам текст, и потом ETX (End Of Text). Как бы вот.

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

Пт сен 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> и исходя из этого мне нужно запустить соответствующее действие. То есть еще придётся как то расшифрововать принятые символы :( :(.....

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

Пт сен 09, 2022 16:34:45

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