CH32V303VCT6 memcpy問題

uint8_t handle_pb620_receive(char *buffer)

{

? ? uint8_t return_byte=0;

? ? memset(buffer,0,USART_BUF_pb620);

? ? if(fifo_pb620.buffer[fifo_pb620.buf_count]!=0)

? ? {

? ? ? ? uint16_t i;

? ? ? ? fifo_pb620.clear = 0;

? ? ? ? i = fifo_pb620.buffer[fifo_pb620.buf_count];

? ? ? ? if(fifo_pb620.in < fifo_pb620.out)

? ? ? ? {

? ? ? ? ? ? for (uint16_t var = 0; var < fifo_pb620.buffer[fifo_pb620.buf_count]; ++var)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? buffer[var] = usart_struct_bufer_pb620.RX_Buffer[fifo_pb620.in + var];

? ? ? ? ? ? }

//? ? ? ? ? ? memcpy(&buffer[0],&(usart_struct_bufer_pb620.RX_Buffer[fifo_pb620.in]),fifo_pb620.buffer[fifo_pb620.buf_count]);

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? for (uint16_t var = 0; var < (USART_BUF_pb620 - fifo_pb620.in); ++var)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? buffer[var] = usart_struct_bufer_pb620.RX_Buffer[fifo_pb620.in + var];

? ? ? ? ? ? }

//? ? ? ? ? ? memcpy(&buffer[0],&(usart_struct_bufer_pb620.RX_Buffer[fifo_pb620.in]),USART_BUF_pb620 - fifo_pb620.in);

? ? ? ? ? ? for(uint16_t k=0;k

? ? ? ? ? ? {

? ? ? ? ? ? ? ? buffer[USART_BUF_pb620 - fifo_pb620.in + k] = usart_struct_bufer_pb620.RX_Buffer[k];

? ? ? ? ? ? }

? ? ? ? }

}

下面是map文件

?.bss.usart_struct_bufer_pb620

? ? ? ? ? ? ? ? 0x000000002000041c? ? ? 0x384 ./drive/usart/drive_usart_pb620.o

? ? ? ? ? ? ? ? 0x000000002000041c? ? ? ? ? ? ? ? usart_struct_bufer_pb620

?.bss.calendar? 0x00000000200007a0? ? ? ? 0xa ./drive/rtc/bsp_rtc.o

? ? ? ? ? ? ? ? 0x00000000200007a0? ? ? ? ? ? ? ? calendar

?*fill*? ? ? ? ?0x00000000200007aa? ? ? ? 0x2?

?.bss.pb620_check_auto_send_cmd

? ? ? ? ? ? ? ? 0x00000000200007ac? ? ? ?0x14 ./Application/app_usart/app_usart_pb620.o

? ? ? ? ? ? ? ? 0x00000000200007ac? ? ? ? ? ? ? ? pb620_check_auto_send_cmd

?.bss.struct_gas_offline_data

? ? ? ? ? ? ? ? 0x00000000200007c0? ? ? ?0x48 ./Application/app_usart/app_usart_pb620.o

? ? ? ? ? ? ? ? 0x00000000200007c0? ? ? ? ? ? ? ? struct_gas_offline_data


#define FIFO_len_pb620? ? ? ? ? ? ? 50? ? ? ? ? ? ? ? ? ? ? //FIFO緩存區(qū)存儲(chǔ)每次接收的數(shù)據(jù)長度

#define USART_BUF_pb620? ? ? ? ? ? ?300? ? ? ? ? ? ? ? ? ? ? //接收數(shù)據(jù)長度

typedef struct

{

? ? uint8_t? ? RX_Buffer[USART_BUF_pb620];? ? ? ? ? ? ? ? ? ? ?//接收數(shù)組

? ? uint8_t? ? TX_Buffer[USART_BUF_pb620];? ? ? ? ? ? ? ? ? ? ?//發(fā)送數(shù)組

? ? uint8_t? ? com[USART_BUF_pb620];? ? ? ? ? ? ? ? ? ? ? ? ? ?//用于處理數(shù)據(jù)

}USART_buffer_pb620;

USART_buffer_pb620? ?usart_struct_bufer_pb620;



handle_pb620_receive中的參數(shù)是usart_struct_bufer_pb620.com,在使用memcpy時(shí),每次拷貝的細(xì)節(jié)為41個(gè),程序運(yùn)行一段時(shí)間后,會(huì)導(dǎo)致后面定義的變量struct_gas_offline_data中的數(shù)據(jù)為memcpy拷貝的最后幾個(gè)字節(jié),該段程序在keil中使用時(shí)未出現(xiàn)問題。后來將memcpy更改為for循環(huán)拷貝,就沒有問題。懷疑指針的地址指錯(cuò)了。不知道是什么原因引起的。


您好,關(guān)于你這段代碼,在for循環(huán)中,你是使用的++var,就導(dǎo)致var第一個(gè)值是從1開始的,不是從0開始的,但當(dāng)你使用memcpy時(shí),是從0開始拷貝的,拷貝的是完整的fifo_pb620.buffer[fifo_pb620.buf_count]個(gè)數(shù)據(jù),這是一個(gè)區(qū)別,你使用memcpy時(shí)可以從1開始試一下。若方便,可將你的工程發(fā)過來我這邊具體看一下,后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频