Пребразование данных с весов в ASCII код

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
W@TT
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт апр 14, 2009 13:50:53
Откуда: Ё~бург
Контактная информация:

Пребразование данных с весов в ASCII код

Сообщение W@TT »

Доброго времени суток уважаемые форумчане. Хочу обратиться к Вам за помощь в решении маленькой проблемки. Корче говоря озадачим меня начальник на работе подключить весы электронные общего назначения МК-32.2_ с выходом RS-232 к печатающему устройству (каплеструйный промышленный принтер EBS). Загвоздка состоит в том, что протоколы передачи данных разные.

Протокол передачи данных для весов:
Передача байта осуществляется через универсальный асинхронный приемопередатчик последовательным потоком 10 бит.
Скорость обмена 4800 бод.
Протокол обеспечивает одностороннюю передачу данных во внешнее устройство.
- 1 стартовый бит;
- 8 бит данных (D0÷D7);
- 1 стоповый бит.
Данные передаются по окончании процесса взвешивания двумя повторяющимися посылками. Каждая посылка содержит 5 байт:
- 1-й и 2-й байты - код начала посылки, содержит числа 55Н и ААН соответственно;
- 3-й и 4-й байты - двухбайтное значение массы в граммах в двоичной системе счисления (4-й байт - старший);
- 5-й байт - знак: 00Н - плюс, 80Н - минус.

У принтера данные принимаются только в ASCII кодах. Каждый передаваемый текст должен заканчиваться знаком ENTER-(0х0D).

Чтобы решить эту задачу я использовал микроконтроллер ATmega8. Подключил вывод RXD к TXD весов, а TXD к RXD принтера. Сделано это было для упрощения, так как обеспечивается односторонняя передача данных.

Теперь самое главное. Я не программист, только учусь=)) С помощью Гугла, Яндекса и матерных слов с горем пополам маленько изучил и написал программу ни С для контроллера,чтобы принимать и передавать данные. Но застрял на том, что не могу нигде ни найти, ни сам пока не соображу, как преобразовать байты массы в ASCII коды. Буду рад услышать от Вас хоть какие нибудь пути решения сей проблемы.
Программа компилировалась и редактировалась в 6 студии.
Пожалуйста не бейте сильно - это мой первый серьезный самостоятельный проект=))

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

#include <avr/io.h>
#define F_CPU 8000000UL //8MHz

uint8_t rx_buf[10];

uint8_t i;
uint8_t MSB = 0; //Старший байт
uint8_t LSB = 0; //Младший байт
uint16_t MSBLSB = 0; //Результат
int s = 0;

void UARTInit(void)    //Инициализация порта UART
{
   UBRRH = 0;
   UBRRL = 103; //baud rate 4800
   UCSRB = (1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8 bit, 1 stop bit
}

unsigned char USART_Receive()
{
   while ( !(UCSRA & (1<<RXC)) );
   return UDR;
}

void UARTSend(uint8_t data)
{
   while(!(UCSRA & (1<<UDRE)));
   UDR = data;
}

int main(void)
{
   UARTInit();
   while(1)
   {
      for (i=0;i<10;i++) //Цикл считывания байтов в массив
      {
      rx_buf[i]=USART_Receive();
      }
   if (rx_buf[0]==0x55 && rx_buf[1]==0xAA && rx_buf[5]==0x55 && rx_buf[6]==0xAA) // проверка правильности переданных данных
      {
   /*   MSB = rx_buf[2]; //Присваиваем ст.байт
      LSB = rx_buf[3]; //Присваиваем мл.байт
      MSBLSB = (MSB << 8 | LSB); //Склеиваем
      
      for(int i=0; MSBLSB; i++)
      {
         s=s+(MSBLSB%10*2^i);   //s=s+int(a%10*2^i)
         MSBLSB/=10;   //a=a/10
      }*/
      
      UARTSend(rx_buf[2]); //передаем старший байт
      UARTSend(rx_buf[3]); //передаем младший байт
      UARTSend(0x0D);   // перенос строки
      UCSRB &= ~(1<<RXCIE);
      }   
      }
}
OVER LOAD
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Пребразование данных с весов в ASCII код

Сообщение Mishany »

если в лоб: получаем значение массы с весов в граммах, далее раскидываем это значение на разряды еденицы, десятки и т.д. и отправляем строкой на принтер в конце строки добавляем ентер все коды из таблицы ascii.
a еще вроде в какой то библиотеке должна готовая функция быть.
Аватара пользователя
W@TT
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт апр 14, 2009 13:50:53
Откуда: Ё~бург
Контактная информация:

Re: Пребразование данных с весов в ASCII код

Сообщение W@TT »

Mishany писал(а):если в лоб: получаем значение массы с весов в граммах, далее раскидываем это значение на разряды еденицы, десятки и т.д. и отправляем строкой на принтер в конце строки добавляем ентер все коды из таблицы ascii.


Вот над этим то я и встрял=((
OVER LOAD
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Пребразование данных с весов в ASCII код

Сообщение uk8amk »

функция printf
библиотека stdio.h
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Пребразование данных с весов в ASCII код

Сообщение Mishany »

все просто:

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

unsigned char temp[6] = {0,0,0,0,0,0x0D};
unsigned char ASCII[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
//функция преобразования
void num_to_str(unsigned int value)//для 5 разрядов
{
   temp[0]=value/10000;
   temp[1]=(value/1000)%10;
   temp[2]=(value/100)%10;
   temp[3]=(value/10)%10
   temp[4]=value%10;
}

//////передача кодов ASCII где то в программе....
for(uint8_t i=0;i<6;i++)
{
UARTSend(ASCII[temp[i]]);
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Пребразование данных с весов в ASCII код

Сообщение Аlex »

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

#include "string.h"

uint8_t tx_buf[10];
uint8_t cat_str[]={0x0D, 0x00};
uint8_t MSB; //Старший байт
uint8_t LSB; //Младший байт
uint8_t Sign; // Знак
int res;


..............
..............
..............

while(1){
 
  if(USART_Receive()!=0x55)   continue;
  if(USART_Receive()!=0xAA)   continue;
  LSB=USART_Receive();
  MSB=USART_Receive();
  Sign=USART_Receive();

  res=((int)MSB<<8) | LSB;
  if(Sign)  res=-res;

  itoa(res, tx_buf, 10);
  strcat(tx_buf, cat_str);

  UARTSendStr(tx_buf);  // Отправляем строку
} // while(1)
UARTSendStr :

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

void UARTSendStr(const uint8_t *pstr){
  while(*pstr)  UARTSend(*pstr++);
}

Ответить

Вернуться в «AVR»