andrew_by 0 28 января, 2016 Опубликовано 28 января, 2016 (изменено) · Жалоба товарищи.. нужно допилить код.. но сам уже запутался.. помогите кто чем может ) суть такая.. есть 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 шлет пакеты, дисковери смотрит если находит у себя в списке похожий то выдает ответ, если не находит то молчит. Изменено 28 января, 2016 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Есть древние приборы, уже 9 лет в серии. Часов реального времени нет, а тут понадобились. Плату, схему менять запретили. Только программные доработки. У всех приборов есть СОМ-порт. Общаются по проприетарному протоколу с компом или другими изделиями. Вот подвесил в разрыв кабеля СОМ-порта от платы до разъёма на корпусе плату на STM32F051, у неё есть встроенные часы реального времени. Задействовал USART1 и USART2. Почему выбор пал на STM32F051 - просто уже была разработана мелкая платочка на нём с двумя USART-ами. Для серии просто ещё кастрировали немного. Прибор по СОМ-порту у платы время запрашивает, а если работает с компом или другими изделиями через порт, то плата для него прозрачна. По протоколу, в блоке данных есть ID, к кому обращается и есть команда. ID для каждого изделия, естественно свой. Так вот, плата на STM32F051: Для каждого USART имеются кольцевые буфера для приёма и передачи. USART-ы работают по прерыванию, принятые байты складывают в приёмный кольцевой буфер, при наличии в буфере передачи байта запускается передача, если буфер передачи пуст - останавливается передача. В фоне анализируется нужный приёмный поток и если ловится свой ID, то выполняется переданная команда. Вкратце всё. Проект не выложу, т.к. комерческий, но можно и поторговаться... :-) Тогда в личку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться