간략한 설명 : 포인터를 통해 구조체에 무언가를 쓰지만 다른 것이 쓰여집니다. 나는 Atollic True Studio 8.1에서 STM32F415RG MCU를 프로그래밍하고 있습니다.포인터를 통해 구조체에 구조체 액세스하기
변수와 표현식 창을 볼지라도 다른 구조의 값을 가진 동일한 구조를 볼 수 있습니다. Same variable in two windows with different values
이제 좀 더 자세히 설명해 드리겠습니다. (더 쉽게 읽을 수 있도록 많은 부분을 단순화 할 예정입니다.) 내 프로토콜 핸들 타입이 정의되어 :
typedef struct
{
RS485DriverHandle master_rs485;
} EscomProtocolHandle;
내 RS485 드라이버 핸들이 정의를 다음과 같이
나는 전역 변수로 내 프로토콜 핸들을 만든typedef struct
{
UART_HandleTypeDef* uart_handle;
TransceiverState transceiver_state;
GPIO_TypeDef* dir_gpio;
uint16_t dir_pin;
} RS485DriverHandle;
:
static EscomProtocolHandle hprot1;
인수로 처리 할 포인터를 사용하는 프로토콜 초기화 함수에 전달합니다.
Escom_Protocol_Init(&hprot1);
초기화 기능 (이 호출이 많이 간략화) 인수로 RS485 핸들 포인터를 얻어 RS485 드라이버 init 함수에 전달 :
void RS485_Init(RS485DriverHandle* rs485_handle, UART_HandleTypeDef* uart_handle,
GPIO_TypeDef* dir_gpio, uint16_t dir_pin)
{
/* default = listening */
rs485_handle->uart_handle = uart_handle;
rs485_handle->dir_gpio = dir_gpio;
rs485_handle->dir_pin = dir_pin;
ReceiverOutputEnable(rs485_handle);
rs485_handle->transceiver_state = kReceiving;
}
:
void Escom_Protocol_Init(EscomProtocolHandle* protocol_handle)
{
RS485_Init(&protocol_handle->master_rs485)
}
RS485 초기화 기능이 디폴트 값을 설정
로컬 변수 rs485_handle을 보면 값이 올바르게 설정되었습니다. 하지만 내 손잡이 hprot1을 보면 값이 일치하지 않습니다. rs485_handle의 주소는 master_rs485hprot1의 주소와 일치합니다. P .: 나는 위의 구조 중 하나의 패킹 (#pragma pack)을 망쳐 놓지 않았으므로 문제가되지 않습니다.
'ReceiverOutputEnable (rs485_handle);'에 중단 점을 배치하십시오. 통화 전과 후에 값을 확인하십시오. 문제가이 호출에만있을 수 있도록 코드에서 잘못된 것이 없습니다. –
'RS485_Init', 특히'UART_HandleTypeDef * uart_handle'에 대한 인수 값은'RS485_Init'과'Escom_Protocol_Init' 및/또는 힙의 외부에서 액세스 할 수있는 범위에 정의되어 있습니까? GPIO_TypeDef * dir_gpio? – Joel
참고 : 우선 순위 규칙이 내가 의도 한 것을 망칠 때도 있습니다. 확실하게하려면 다음과 같이 작성하십시오 :'RS485_Init (& (protocol_handle-> master_rs485))'(올바른 것의 주소가 취해 졌는지 확인하십시오) –