本帖最后由 YaphetS 于 2013-4-19 11:10 编辑
编译环境 picc18 v9.8 pro + mplab x 单片机 PIC18F6628
问题描述:定义了一个较大的局部变量数组,64个char在局部函数中执行串口缓冲数组时好像发生了传说中的元素错乱的情况,可能有点说得不清楚具体看代码:
首先是出问题的函数:- u8t dc_ip_addr[4] = {115, 238, 188, 206};
- u16t dc_ip_port = 5555;
- static u8t GPRS_CIPSTART(UART_RX_FIFO *pUART_FIFO, const u8t uart_port, u16t time_wait)
- {
- u8t jmp = 0;
- u8t tcp_buf[64];
- sprintf(tcp_buf, "%s"%d.%d.%d.%d","%d"\r\n","AT+CIPSTART="TCP",",
- dc_ip_addr[0], dc_ip_addr[1], dc_ip_addr[2], dc_ip_addr[3],
- dc_ip_port); //按格式输出到字符串
- DataFIFO_CLR(pUART_FIFO);//!!!!!!!!!!
-
- UART_PutStr(uart_port, tcp_buf);
- }
有段无关的代码没有放出来
再看看其中的一个子函数,因为问题就出在
DataFIFO_CLR(pUART_FIFO);
这个函数里面,该函数用来清空初始化环形数组结构体里面的变量的- void DataFIFO_CLR(UART_RX_FIFO *pUART_FIFO)
- {
- u8t i;
- pUART_FIFO->wr_index = 0;
- pUART_FIFO->rd_index = 0;
- pUART_FIFO->count = 0;
- pUART_FIFO->size = UART_RX_FIFO_SIZE;//UART_RX_FIFO_SIZE=128
- for (i = 0; i < UART_RX_FIFO_SIZE; i++)
- pUART_FIFO->FIFO[i] = 0;
- }
经过查了好久的资料发现,这边主要用到两个较大的局部变量数组,一个是tcp_buf[64] 一个是结构体里面的FIFO[128]
我有理由怀疑越界了,但是刚刚接触不是很熟悉,而问题就是
我打算通过串口发给从机这样的指令
输出的结果应该是 AT+CIPSTART="TCP","115.238.188.206","5555"
事实却是 AT+CIPSTART="TCP","115.238.188.200005555"
后几位却被程序篡改了,经过单步分析在执行 DataFIFO_CLR(pUART_FIFO);之前tcp_buf数组内的内容都是正确的,执行过初始化之后却不再正确,就变成下面输出的错误的字符,即被篡改的。
后来一直再寻找解决方案
找到两个解决的办法
1 将 DataFIFO_CLR(pUART_FIFO);放到sprintf之前执行 可以输出正确的结果
2 将 tcp_buf声明成全局变量,虽然这样可以解决,但是心底却一点都不踏实,因为还是不明白为什么之前那样不行
希望yewuyi还有其他网友给出一些指导
现在准备实验的其他办法 一是采用malloc动态申请空间 其次准备在声明局部变量tcp_buf之前加上bank0这样的关键字
|