Jump to content

    
Sign in to follow this  
andrew_by

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

Recommended Posts

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

 

суть такая.. есть 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this