Протокол передачи данных для весов:
Передача байта осуществляется через универсальный асинхронный приемопередатчик последовательным потоком 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);
}
}
}