#c
#c
Вопрос:
Я разрабатываю код, в котором мне нужно прочитать значение из одной функции («Read()») в другую функцию («compare»), используя указатель. Необходимо получить доступ к значениям «буфера», присутствующим в функции «Read()». Я попробовал приведенный ниже подход, я новичок в реализации указателей, поэтому не могу много пробовать. «buffer» будет содержать 9 элементов, которые я скопировал в «adata» в функции «Read ()», эти данные должны быть в функции «Compare». Ниже приведен мой фрагмент кода:
int16_t *Read (uint8_t *buffer, const uint16_t length)
{
static uint32_t totalBytes = 0;
static uint32_t respNo = 0;
int i;
GPIO_ClearValue(PMAP_GPIO_PORT_DIR_RS485, PMAP_GPIO_PIN_DIR_RS485);
UartRxFlush(UARW_UART_INDEX_RS485); //this function needs to be executed after the GPIO_ClearValue in order to remove the "zero" value from the buffer
respNo ;
int counter = 0; // counts n. valid bytes put in slave response buffer[]
do
{
OSTimeDly(2);
int8_t newBytesRcv = UartReceive(UARW_UART_INDEX_RS485,
(uint8_t*)amp;(buffer[counter]), length-counter);
totalBytes = newBytesRcv;
counter = totalBytes;
}
while (counter < length);
totalBytes = 0;
printf("n");
printf("Byte received........");
int16_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
for (i=0; i<9;i )
{
printf("%d ",buffer[i]);
adata[i] = buffer[i];
}
printf("n");
}
int16_t Compare(uint8_t * message, uint16_t len)
{
rs485_message_t rs485Msg;
int StP15Vmsg[9] = {0x09,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x34};
int adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
uint8_t buffer[9];
const uint8_t length;
for (int j=0; j<=9; j )
{
adata[j] = *Read(buffer, j);
}
if(compareArray(FWmsg,arduinodata,7)==0)
{
char res;
uint8_t add, fwcommand, fwaction;
uint16_t fwvalue;
rs485_message_t rs485Msg;
proto485ComposeMsg(amp;rs485Msg, amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue);
res = GetABFWversion(amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue);
}
}
Пожалуйста, укажите….
Спасибо
Комментарии:
1. В вашей
Compare
функции вы выходите за пределыadata
массива.2. вы никогда
return
не получаете значение изRead
3. @sebastian Спасибо за ответ, какое значение я должен вернуть в функции «Read ()», я пытался вернуть «adata», но это выдает мне ошибку «Ошибка [Pe120]: тип возвращаемого значения («int16_t *») не соответствует типу функции («int16_t»)» даже после попытки вернуть «buffer»
4. вы никогда не возвращаете значение в Compare , вы просто устанавливаете локальный массив, который никогда не использовался после, и никогда не делаете что-то похожее на compare, почему название «Сравнить»? Compare не использует его параметры. При чтении вы также задаете локальный массив adata впустую
5. @bruno Я внес изменения на основе ваших комментариев, но не смог получить значения «buffer» в функции «Compare()». он показывает значения мусора………
Ответ №1:
Примечание: это не в строгом смысле «ответ», а скорее список замечаний
О чтении
подпись
int16_t *Read (uint8_t *buffer, const uint16_t length)
но функция никогда не возвращает значение, вероятно, вы хотите вернуть количество прочитанных байтов, в этом случае
int16_t Read (uint8_t *buffer, const uint16_t length)
Статическая переменная respNo только увеличивается и никогда не используется, эти две строки можно удалить :
static uint32_t respNo = 0; respNo ;
Нет причин иметь статическое значение totalBytes, потому что вы сбрасываете его значение в 0 перед печатью буфера, поэтому нет хронологии от вызова к следующему. Оно должно быть локальным.
счетчик бесполезен, потому что он всегда имеет значение totalBytes
UartReceive всегда успешен и никогда не возвращает значение, указывающее на ошибку?
- если да, то бесполезно, чтение возвращает значение, потому что оно всегда будет длиной
- если нет, вы должны принять во внимание ошибку и, вероятно, Read придется возвращать totalBytes, оценивая количество прочитанных байтов
В
printf("n");
printf("Byte received........");
int16_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
for (i=0; i<9;i )
{
printf("%d ",buffer[i]);
adata[i] = buffer[i];
}
printf("n");
- вы выполняете цикл от 1 до 9, а не от 0 до 8, так что вы, по крайней мере, выходите из adata и не печатаете значение первого байта в буфере
- вы только устанавливаете adata и никогда им не пользуетесь, его можно удалить.
- формат должен быть %u, а не %d
Вероятно, цикл должен быть от 0 до totalBytes - 1
, чтобы быть совместимым с приведенным выше кодом :
printf("nByte received : ");
for (i=0; i<totalBytes;i )
{
printf("%u ",buffer[i]);
}
putchar('n');
О сравнении
В
rs485_message_t rs485Msg; int StP15Vmsg[9] = {0x09,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x34}; int adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}; uint8_t buffer[9]; const uint8_t length; for (int j=0; j<=9; j ) { adata[j] = *Read(buffer, j); }
rs485Msg и StP15Vmsg бесполезны, удалите их
Я не понимаю, почему вы вызываете Read несколько раз в цикле с увеличением длины каждый раз, поэтому вы будете переписывать несколько раз в буфер. Я тоже не понимаю, пока вы сохраняете возвращаемое значение Read (которые возвращают значение в данный момент)
Вероятно, вы хотите именно этого :
uint8_t buffer[9];
uint8_t length = Read(buffer, 9);
В
if(compareArray(FWmsg,arduinodata,7)==0) { char res; uint8_t add, fwcommand, fwaction; uint16_t fwvalue; rs485_message_t rs485Msg; proto485ComposeMsg(amp;rs485Msg, amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue); res = GetABFWversion(amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue); }
У меня нет ссылки на приведенный выше код, и res установлен, но никогда не использовался
Compare никогда не выполняет сравнение, почему оно называется Compare? Он никогда не возвращает значение, какое значение он должен возвращать?