Jump to content

    

STM32F4Discovery + UART .. нужна помощь

товарищи.. нужно допилить код.. но сам уже запутался.. помогите кто чем может )

 

суть такая.. есть 2 устройства с UART , я в разрыв вставляю Дисковери и хочу что бы все данные которые шли от устр1 шли без оработки к устр2 ,

а данные от устр2 заходили на Дисковери и если пакет данных соответсвует условию.. то посылались б другие , а если нет .. то также просзрачно слались бы..

 

или натолкните на правильный пример ..

 

#include "main.h"

uint16_t delay_count=0;
uint8_t	Mode=0;
uint16_t Mode_count=0;
uint8_t Mode_new=0;

uint8_t Button_count=0;
uint8_t Button_state=0;



char GetData10[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0xD3,0xDF};
char DataOtvet1[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A};
char GetData20[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x2e,0x92};
char DataOtvet2[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x01,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0xAA,0x5B};
char GetData30[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x29,0x44};
char DataOtvet3[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x02,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xAC};
char GetData40[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0xD4,0x09};
char DataOtvet4[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x03,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0x17,0xED};
char GetData50[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0xA8,0x8E};
char DataOtvet5[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A};

char GetData21[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x55,0xc3};

char GetData60[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x01,0x00,0x40,0x00,0x01,0xC3,0x41};
char DataOtvet6[] = {0x55,0x2B,0x04,0x58,0x0c,0x03,0x01,0x00,0xc0,0x00,0x01,0x00,0x10,0x58,0x43,0x4f
,0x52,0x45,0x5f,0x45,0x53,0x43,0x5f,0x56,0x78,0x00,0x00,0x00,0x00,0x02,0x02,0x00
,
0x01,0x00,0x00,0x0a,0x01,0xad,0x9f,0x01,0x04,0x4d,0x8c};
char GetData70[] = {0x55,0x0D,0x04,0x33,0x03,0x2c,0x02,0x00,0x40,0x00,0x01,0x6f,0xd9};
char DataOtvet7[] = {0x55,0x2B,0x04,0x58,0x2c,0x03,0x02,0x00,0xc0,0x00,0x01,0x00,0x10,0x58,0x43,0x4f
,0x52,0x45,0x5f,0x45,0x53,0x43,0x5f,0x56,0x78,0x00,0x00,0x00,0x00,0x02,0x02,0x00
,
0x01,0x00,0x00,0x0a,0x01,0xbe,0x59,0x01,0x04,0xae,0x53};
char GetData80[] = {0x55,0x0D,0x04,0x33,0x03,0x4c,0x03,0x00,0x40,0x00,0x01,0x9a,0x55};
char DataOtvet8[] = {0x55,0x2B,0x04,0x58,0x4c,0x03,0x03,0x00,0xc0,0x00,0x01,0x00,0x10,0x58,0x43,0x4f
,0x52,0x45,0x5f,0x45,0x53,0x43,0x5f,0x56,0x78,0x00,0x00,0x00,0x00,0x02,0x02,0x00
,
0x01,0x00,0x00,0x0a,0x01,0xc1,0xe2,0x01,0x04,0x57,0x0a};
char GetData90[] = {0x55,0x0D,0x04,0x33,0x03,0x6c,0x04,0x00,0x40,0x00,0x01,0x26,0xe0};
char DataOtvet9[] = {0x55,0x2B,0x04,0x58,0x6c,0x03,0x04,0x00,0xc0,0x00,0x01,0x00,0x10,0x58,0x43,0x4f
,0x52,0x45,0x5f,0x45,0x53,0x43,0x5f,0x56,0x78,0x00,0x00,0x00,0x00,0x02,0x02,0x00
,
0x01,0x00,0x00,0x0a,0x01,0xdb,0x38,0x01,0x04,0x05,0x38};



char GetData11[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0xa8,0x8e};
char GetData31[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0x52,0x15};
char GetData41[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,0xaf,0x58};


struct CMsg
{
 char * In;
 char * Out;
 int SizeIn;
 int SizeOut;

};

void Init ( struct CMsg * msg , char * in, int size_in, char * out, int size_out )
{
msg -> In = in;
msg -> Out = out;
msg -> SizeIn = size_in;
msg -> SizeOut = size_out;
}

struct CMsg Messages [ 13 ];

//----------------------------------------------
//
//----------------------------------------------
void SysTick_Handler(void)//1ms
{

}



//----------------------------------------------
//
//----------------------------------------------
void delay_ms(uint16_t delay_temp)
{
delay_count = delay_temp;

while(delay_count){}
}


//----------------------------------------------
//
//----------------------------------------------
void SendStrtoPC(char* str_p, uint16_t count)
{
	uint16_t i=0;

	while(i < count)
	{
		while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET){}
		USART_SendData(USART2, str_p[i]);
		i++;
	}
}

char ReadByte (void )
{
while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){}
return USART_ReceiveData ( USART2 );
}	


void loop() {

 char cur;
char msg_len;
 char Buffer [ 256 ];
int i = 0 ,j=0, Valid;

 do
 {
cur = ReadByte ();
	Buffer [ 0 ] = cur;
 }
 while ( cur != 0x55);


 msg_len = ReadByte ();

 Buffer [ 0 ] = 0x55;
 Buffer [ 1 ] = msg_len;
 for ( i = 2; i != msg_len; ++i )
 {
Buffer [ i ] = ReadByte ();
 }

 for ( i = 0; i != sizeof ( Messages ) / sizeof ( struct CMsg); ++i )
 {
if ( Messages [ i ].SizeIn != msg_len  )
  continue;

Valid = 1;
for ( j = 0; j != msg_len; ++j )
{
  if ( Messages [ i ].In [ j ] != Buffer [ j ] )
  {
	Valid = 0;
	break;
  }
}

if ( Valid )
{
  for ( j = 0; j != Messages [ i ].SizeOut; ++j )
		{
			while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
			{}
		  USART_SendData(USART2, Messages [ i ].Out [ j ] );
		}

  return; // reply sent
}
 }
}


int main(void)
{

 Init ( &Messages [0], GetData10, sizeof (GetData10), DataOtvet1, sizeof (DataOtvet1) );
 Init ( &Messages [1], GetData11, sizeof (GetData11), DataOtvet1, sizeof (DataOtvet1) );
 Init ( &Messages [2], GetData20, sizeof (GetData20), DataOtvet2, sizeof (DataOtvet2) );
 Init ( &Messages [3], GetData21, sizeof (GetData21), DataOtvet2, sizeof (DataOtvet2) );
 Init ( &Messages [4], GetData30, sizeof (GetData30), DataOtvet3, sizeof (DataOtvet3) );
 Init ( &Messages [5], GetData31, sizeof (GetData31), DataOtvet3, sizeof (DataOtvet3) );
 Init ( &Messages [6], GetData40, sizeof (GetData40), DataOtvet4, sizeof (DataOtvet4) );
 Init ( &Messages [7], GetData41, sizeof (GetData41), DataOtvet4, sizeof (DataOtvet4) );
 Init ( &Messages [8], GetData50, sizeof (GetData50), DataOtvet5, sizeof (DataOtvet5) );
 Init ( &Messages [9], GetData60, sizeof (GetData60), DataOtvet6, sizeof (DataOtvet6) );
 Init ( &Messages [10], GetData70, sizeof (GetData70), DataOtvet7, sizeof (DataOtvet7) );
 Init ( &Messages [11], GetData80, sizeof (GetData80), DataOtvet8, sizeof (DataOtvet8) );
 Init ( &Messages [12], GetData90, sizeof (GetData90), DataOtvet9, sizeof (DataOtvet9) );


SysTick_Config(SystemCoreClock/1000);//1 ms

USART2_ini();

while(1)
{

	loop ();
}
}

 

это код когда есть только устр1 и дисковери .. устр1 шлет пакеты, дисковери смотрит если находит у себя в списке похожий то выдает ответ, если не находит то молчит.

Edited by IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Share this post


Link to post
Share on other sites

Есть древние приборы, уже 9 лет в серии. Часов реального времени нет, а тут понадобились. Плату, схему менять запретили. Только программные доработки.

У всех приборов есть СОМ-порт. Общаются по проприетарному протоколу с компом или другими изделиями.

Вот подвесил в разрыв кабеля СОМ-порта от платы до разъёма на корпусе плату на STM32F051, у неё есть встроенные часы реального времени. Задействовал USART1 и USART2. Почему выбор пал на STM32F051 - просто уже была разработана мелкая платочка на нём с двумя USART-ами. Для серии просто ещё кастрировали немного.

Прибор по СОМ-порту у платы время запрашивает, а если работает с компом или другими изделиями через порт, то плата для него прозрачна.

По протоколу, в блоке данных есть ID, к кому обращается и есть команда. ID для каждого изделия, естественно свой.

Так вот, плата на STM32F051:

Для каждого USART имеются кольцевые буфера для приёма и передачи.

USART-ы работают по прерыванию, принятые байты складывают в приёмный кольцевой буфер, при наличии в буфере передачи байта запускается передача, если буфер передачи пуст - останавливается передача.

В фоне анализируется нужный приёмный поток и если ловится свой ID, то выполняется переданная команда.

Вкратце всё.

Проект не выложу, т.к. комерческий, но можно и поторговаться... :-) Тогда в личку.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this