Я бы посоветовал вам объявить массив в функции main()
сам передать укажите ссылку на функцию getdata, поэтому при обновлении getdata()
, который будет отображаться в массиве в main()
.
Примечание: Кстати, почему вы используете sizeof (recChars), который даст 6, но вы обновляете только до 2 местоположений. Я включить это также в коде
int main(void)
{
char recChars[6];
int Rxd_Len = 0;
Rxd_Len = getdata(&recChars); //Pass the address of array
uart_write(UART_D, (uint8_t *)recChars, Rxd_Len);
}
int getdata(char *ptr_recChars)
{
uint8_t ndx; // removed static since its not a required/mandatory
char retchar;
ndx = 0;
retchar = getch();
*(ptr_recChars + ndx) = retchar; //Asign the value to the array address + offset
if (retchar == '\r'){
ndx++;
*(ptr_recChars + ndx) = '\n';
}
return ndx;
}
char getch(void) {
uint8_t ch = 0;
int ret;
ret = uart_read(UART_D, &ch);
return ((char) ch);
}
UPDATE:
Это нормально называть uart_write() в основной()? Да, вы можете это сделать, но так как uart_write()
будет использовать длину для передачи, вам нужно отслеживать ее, используя другую переменную.
Кроме того, почему эта линия необходима? Что он делает *(ptr_recChars + ndx) = retchar;
? ptr_recChars указатель, который указывает на массив recChars[6]
, поэтому с помощью этого указателя можно обновить массив recChars[6]
, даже если он объявлен в main()
, *(ptr_recChars + ndx)
, здесь ndx
является 0
так обновляется первый элемент массива, то после этого вам приращение ndx
затем, используя переменный указатель, мы можем указать на новое обновленном место на *(ptr_recChars + ndx)
(с ndx
новым значением в настоящее время)
Кроме того, я должен & оператора в GetData (& recChars); Нет, имя массива само по себе является указателем, поэтому для recChars[6]
simplay, дающий recChars
, предоставит базовый адрес массива, а также примечание recChars
и &recChars[0]
означает то же самое. Так что если вы дадите &recChars
, значит, recChars
- это адрес, а затем добавление &recChars
принимает адрес адреса, который даст вам недопустимое значение в вашем выражении.
Можете ли вы использовать стандартные библиотечные функции? (Вы не указываете какие-либо 'include', и ваше собственное определение 'getch' предполагает, что вы не можете.) – usr2564301
Вам нужно объявить свою функцию как возвращающую указатель на char *, а также создать массив как указатель на char и распределить его динамически с помощью malloc, иначе данные будут удалены при выходе из функции. Я не запрограммировал в C какое-то время, поэтому я мог бы быть здесь. –
По какой-либо причине вы используете правильный декларатор стиля прототипа для 'main' и' getch', но не для 'getdata', иначе вы используете устаревший старый стиль? – Olaf