Я пытаюсь проверить, будет ли (и где) подстрока («DATA») расположена в большой строке (расположенной в буфере - linearBuffer) функцией strstr(), но он, похоже, не работает, и я не знаю, почему, хотя моя исходная строка (находящаяся в линейном буфере) в нулевом завершении.Функция strstr() возвращает адрес 0x0000
Что действительно произошло, так это то, что ringbuffer (buf) заполняется символами для каждого прерывания USART. Затем в некоторой точке кода его содержимое копируется в линейный буфер (через ringBuff_to_linearBuff()), и я применяю на нем функцию strstr(), чтобы найти нужную подстроку. Значение, которое я получаю, когда функция strstr() возвращает значение 244, а не местоположение события подстроки, хотя я знаю его там от установки точки останова
** Обратите внимание, что мой код распространяется по многим файлам, поэтому я попытался чтобы собрать все вопросы, связанные с кодом.
#include <string.h>
#define BUFFER_SIZE 400
#define LINEAR_BUFFER_SIZE (BUFFER_SIZE+1)
#define WIFI_CMD_DATA "DATA"
typedef RingBuff_Data_t uint8_t;
typedef struct
{
RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */
RingBuff_Data_t* In; /**< Current storage location in the circular buffer */
RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */
} RingBuff_t;
volatile RingBuff_t buf;
uint8_t linearBuffer[LINEAR_BUFFER_SIZE]="";
static inline void RingBuffer_Insert(RingBuff_t* const Buffer, const RingBuff_Data_t Data)
{
*Buffer->In = Data;
if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
Buffer->In = Buffer->Buffer;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
Buffer->Count++;
}
}
ISR(USART1_RX_vect)
{
//code to be executed when the rx pin of the USART receives a char
uint8_t c = UDR_N;
if (c != '\n')
RingBuffer_Insert(&buf,c);
else
RingBuffer_Insert(&buf,'\0');
}
void ringBuff_to_linearBuff(uint8_t linearBuffer[])
{
memset(linearBuffer,0,LINEAR_BUFFER_SIZE);
RingBuff_Data_t* tempIn = buf.In;
if (buf.Out < tempIn){
memcpy(linearBuffer, buf.Out, tempIn - buf.Out);
}
else if (buf.Out > tempIn){
size_t s1 = buf.Buffer + BUFFER_SIZE - buf.Out;
size_t s2 = buf.In - buf.Buffer;
memcpy(linearBuffer, buf.Out, s1);
memcpy(linearBuffer + s1, buf.Buffer, s2);
}
}
void main()
{
uint8_t* linearBufferp;
while (1)
{
if (buf.Out != buf.In)
{
ringBuff_to_linearBuff(linearBuffer);
linearBufferp = strstr(linearBuffer, WIFI_CMD_DATA); // Checking if a new DATA msg from a client had arrived
if (linearBufferp != NULL)
{
//do something
}
}
}
}
Почему вы используете 'uint8_t' массив для хранения строк? Во всяком случае, было бы лучше добавить 'printf («% s \ n », linearBuffer);' перед вызовом 'strstr', чтобы мы могли убедиться, что он есть. – fluter
Нам сложно помочь, так как код неполный. Например, мы не знаем, правильно ли инициализированы 'Buffer-> In' и' Buffer-> Out'. И мы не знаем призов 'ISR' и действительно ли это завершено завершение NUL до вызова ringBuff_to_linearBuff'. – kaylum
Что такое 'linearBufferp'? – alk