Skip to content

Commit

Permalink
какая-то магия с таймингами при работе с рациями
Browse files Browse the repository at this point in the history
* Реализовал доп проверку в приёме пакета, так как обнаружилось, что при передаче голосовых данных мог придти абсолютно ненужный пакет большой длины, поэтому теперь игнорируем такие пакеты;
* в приёме байта в случае неудачи возвращаю 0, так 0xffff мог угодить в длину, и тогда мы долго, пытаемся поймать пакет большой длины;
* с таймингами нужно разобраться, пока не понял в чем дело, но delay между пустым пакетом и запросом делает то, что нужно, но пауза на отпрвку нет (??);
  • Loading branch information
iamsaywhat committed Mar 16, 2020
1 parent 2f3037b commit 7e1a609
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 61 deletions.
53 changes: 18 additions & 35 deletions BUP.uvoptx
Original file line number Diff line number Diff line change
Expand Up @@ -144,50 +144,18 @@
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>101</LineNumber>
<LineNumber>95</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134258152</Address>
<Address>134255728</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>.\custom.drivers\otherlib.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>59</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>.\main.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>2</Number>
<Type>0</Type>
<LineNumber>60</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>.\main.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
<Expression>\\BK_BRPU\main.c\95</Expression>
</Bp>
</Breakpoint>
<WatchWindow1>
Expand All @@ -211,6 +179,11 @@
<WinNumber>1</WinNumber>
<ItemText>systemTime,0x10</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>sdsIdList</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>
Expand Down Expand Up @@ -283,6 +256,16 @@
<WinNumber>2</WinNumber>
<ItemText>buffer</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>2</WinNumber>
<ItemText>sdsNum</ItemText>
</Ww>
<Ww>
<count>15</count>
<WinNumber>2</WinNumber>
<ItemText>sdsIdList</ItemText>
</Ww>
</WatchWindow2>
<MemoryWindow1>
<Mm>
Expand Down
7 changes: 7 additions & 0 deletions custom.drivers/include/radiostation.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
//#define SNS_TURN_ON_DELAY 5000 // Задержка на включение модуля, мс


#define PACKET_SIZE_LIMIT 256
#define RADIO_ADDRESS 0x01

#define RADIO_SEND_PAUSE 40

typedef __packed struct{
uint8_t index;
uint8_t address;
Expand Down Expand Up @@ -47,6 +52,8 @@ typedef enum{
RADIO_TIMEOUT,
RADIO_SUCCESS,
RADIO_FAILED,
RADIO_WRONG_ADDRESS,
RADIO_EXCESS_PACKET_SIZE,
}RadioStatus;


Expand Down
83 changes: 77 additions & 6 deletions custom.drivers/radiostation.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,38 @@ void getDeviceName(void)
uint16_t size = 0; // Размер принятых данных
uint8_t data[] = "ATI"; // Команда
TimeoutType timeout; // Таймаут


setTimeout (&timeout, 150); // Устанавлливаем таймаут
setTimeout (&timeout, 500); // Устанавлливаем таймаут
Radio_initialize(); // Включаем обмен

// /////////////////////////////////
// Radio_send(frameIndex, 0, 0);
// while (timeoutStatus(&timeout) != TIME_IS_UP){
// if(Radio_receive(frameIndex, buffer, &size) != RADIO_SUCCESS){
// Radio_send(frameIndex, 0, 0);
// continue;
// }
// else
// break;
// }
// memset(buffer, 0, size);
// frameIndex++;
//
// Radio_send(frameIndex, 0, 0);
// while (timeoutStatus(&timeout) != TIME_IS_UP){
// if(Radio_receive(frameIndex, buffer, &size) != RADIO_SUCCESS){
// Radio_send(frameIndex, 0, 0);
// continue;
// }
// else
// break;
// }
// memset(buffer, 0, size);
// frameIndex++;
//
//
// ////////////////////////////////////////////
Radio_send(frameIndex, data, sizeof(data)-1); // Посылаем команду
while (timeoutStatus(&timeout) != TIME_IS_UP){ // И следим за таймаутом
if(Radio_receive(frameIndex, buffer, &size) != RADIO_SUCCESS){ // Принимаем ответ
Expand All @@ -102,8 +131,37 @@ void getManufacturerName(void)
uint8_t data[] = "AT+GMI"; // Команда
TimeoutType timeout; // Таймаут

setTimeout (&timeout, 150); // Устанавлливаем таймаут
setTimeout (&timeout, 500); // Устанавлливаем таймаут
Radio_initialize(); // Включаем обмен


// /////////////////////////////////
// Radio_send(frameIndex, 0, 0);
// while (timeoutStatus(&timeout) != TIME_IS_UP){
// if(Radio_receive(frameIndex, buffer, &size) != RADIO_SUCCESS){
// Radio_send(frameIndex, 0, 0);
// continue;
// }
// else
// break;
// }
// memset(buffer, 0, size);
// frameIndex++;
//
// Radio_send(frameIndex, 0, 0);
// while (timeoutStatus(&timeout) != TIME_IS_UP){
// if(Radio_receive(frameIndex, buffer, &size) != RADIO_SUCCESS){
// Radio_send(frameIndex, 0, 0);
// continue;
// }
// else
// break;
// }
// memset(buffer, 0, size);
// frameIndex++;
// ////////////////////////////////////////////


Radio_send(frameIndex, data, sizeof(data)-1); // Посылаем команду
while (timeoutStatus(&timeout) != TIME_IS_UP){ // И следим за таймаутом
if(Radio_receive(frameIndex, buffer, &size) != RADIO_SUCCESS){ // Принимаем ответ
Expand Down Expand Up @@ -205,7 +263,7 @@ RadioStatus deleteSds(uint8_t idSds)
else // Если попали сюда, то пакет был принят
break; // И даже пакет был верным
}
//memset(buffer, 0, size); // Приёмный буфер необходимо очистить
memset(buffer, 0, size); // Приёмный буфер необходимо очистить
Radio_deinitialize(); // Выключаем обмен
frameIndex++; // Инкремент индекса кадра
}
Expand Down Expand Up @@ -416,13 +474,19 @@ void Radio_deinitialize (void)
***************************************************************************************************************/
void Radio_send(uint8_t index, uint8_t *data, uint8_t size)
{
static TimeoutType sendPause = {0, 1, TIME_IS_UP};
TimeoutType timeout;
RadioBaseFrameType baseFrame;
RadioDataFrameType dataFrame;
uint16_t packetSize;
uint8_t special[2] = {0x0D, 0x0A};
uint16_t i;


if(timeoutStatus(&sendPause) == TIME_IS_UP)
setTimeout (&sendPause, RADIO_SEND_PAUSE);
else
while(timeoutStatus(&sendPause) != TIME_IS_UP);

while (UART_GetFlagStatus (RADIO_UART, UART_FLAG_RXFE) != SET) // Вычищаем FIFO приёмника от мусора
UART_ReceiveData(RADIO_UART);

Expand Down Expand Up @@ -511,6 +575,13 @@ RadioStatus Radio_receive(uint8_t index, uint8_t* data, uint16_t *size)
crc = Crc16(&baseFrame.Buffer[i], 1, crc);
}
baseFrame.Struct.length = swapUint16(baseFrame.Struct.length);

// На этом этапе уже можем проверить валидность исключив очевидные варианты
if(baseFrame.Struct.address != RADIO_ADDRESS) // Адрес должен быть наш, остальные игнорируем
return RADIO_WRONG_ADDRESS;
if(baseFrame.Struct.length > PACKET_SIZE_LIMIT) // Не используем пакеты больше PACKET_SIZE_LIMIT
return RADIO_EXCESS_PACKET_SIZE; // поэтому если пакет больше, он нам точно неинтересен

*size = baseFrame.Struct.length;
// Поле данных
for(i = 0; i < baseFrame.Struct.length; i++)
Expand Down Expand Up @@ -632,15 +703,15 @@ uint16_t receiveByte(MDR_UART_TypeDef* UARTx)
while ((UART_GetFlagStatus (UARTx, UART_FLAG_RXFE) == SET)
&& (timeoutStatus(&timeout) != TIME_IS_UP));
if(timeout.status == TIME_IS_UP) // Если выход из ожидания по таймауту,
return 0xFFFF; // то возвращаем ошибку и выходим
return 0; // то возвращаем ошибку и выходим
byte = UART_ReceiveData(UARTx); // Иначе принимаем байт
if(byte == FESC) // Если поймали символ FESC, то смотрим каким будет следующий
{
setTimeout (&timeout, RADIO_BYTE_TIMEOUT); // Ждем прихода информации
while ((UART_GetFlagStatus (UARTx, UART_FLAG_RXFE) == SET)
&& (timeoutStatus(&timeout) != TIME_IS_UP));
if(timeout.status == TIME_IS_UP) // Если выход из ожидания по таймауту,
return 0xFFFF; // то возвращаем ошибку и выходим
return 0; // то возвращаем ошибку и выходим
byte = UART_ReceiveData(UARTx); // Иначе принимаем байт
if(byte == TFEND) // Если принят TFEND
byte = FEND; // Значит это закодированный FEND
Expand Down
66 changes: 46 additions & 20 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@ int main(void)



const uint32_t delay = 30;

setTimeout (&timeout, delay);
while (timeoutStatus(&timeout) != TIME_IS_UP);

while(1)
{
Expand All @@ -72,33 +75,56 @@ int main(void)
//SelfTesting_SNS();
//BUP_UpdateDataFromSNS ();


//////////////////////////////////////////////
// sendEmpty();
// delay_ms(40);
// sendEmpty();
// delay_ms(40);
// delay_ms(delay);
// getDeviceName();
//
// sendEmpty();
// delay_ms(40);
// delay_ms(delay);
// getManufacturerName();

// sendEmpty();
// delay_ms(40);
// delay_ms(delay);
// getListSDS();
//
// sendEmpty();
// delay_ms(40);
// delay_ms(delay);
// getListSDS();
//////////////////////////////////////////////////////
sendEmpty();
setTimeout (&timeout, delay);
while (timeoutStatus(&timeout) != TIME_IS_UP);
getDeviceName();

sendEmpty();
setTimeout (&timeout, delay);
while (timeoutStatus(&timeout) != TIME_IS_UP);
getManufacturerName();

sendEmpty();
setTimeout (&timeout, delay);
while (timeoutStatus(&timeout) != TIME_IS_UP);
getListSDS();

sendEmpty();
setTimeout (&timeout, delay);
while (timeoutStatus(&timeout) != TIME_IS_UP);
getListSDS();

/////////////////////////////////////////////////////

//// sendEmpty();
// sendEmpty();
// delay_ms(40);
// getDeviceName();
// delay_ms(40);
// getDeviceName();
// delay_ms(40);
//
//// sendEmpty();
// sendEmpty();
// getManufacturerName();
// delay_ms(40);
// sendEmpty();
// delay_ms(40);
// sendEmpty();
// delay_ms(40);
// //getListSDS();
// //getSDS(5);
// deleteSds(9);
getDeviceName();

//// sendEmpty();
// sendEmpty();
// getListSDS();

}

Expand Down

0 comments on commit 7e1a609

Please sign in to comment.