我在使用const char buffer和char arrray写入USARt时遇到问题。
这是我的UART写入功能:
unsigned int USART_Send( unsigned char *p_pucData,
unsigned int p_unLen)
{
AT91C_BASE_US2->US_TPR = (unsigned int)p_pucData;
AT91C_BASE_US2->US_TCR = p_unLen;
AT91C_BASE_US2->US_PTCR = AT91C_PDC_TXTEN;
while((AT91C_BASE_US2->US_CSR & ((0x1 << 11) | (0x1 << 4) ) ) == 0);
AT91C_BASE_US2->US_PTCR = AT91C_PDC_TXTDIS;
return p_unLen;
}
下面的函数使用const char * like:
USART_Send("IsitDone?",9); //Working
如果我使用如下所示的数组缓冲区,它会显示垃圾字符,想知道为什么?
unsigned char arr[10];
memcpy(arr, "HelloWorld", 10);
USART_Send(arr, sizeof(arr)); //Not working properly displaying Garbage chars
答案 0 :(得分:0)
里卡多·克鲁多是对的。您遇到以下问题:
arr is created on the stack
arr is filled
call USART_Send
fill transmit pointer, counter, enable tx requests
/* peripheral state is TXBUFE = '0' and ENDTX = '0' because: */
/* TXBUFE = '0' when PERIPH_TCR != 0 and */
/* ENDTX = '0' when PERIPH_TCR != 0 */
/* but we just wrote to PERIPH_TCR, so it's != 0 */
/* both conditions are satisfied, b/c the transfer hasn't started yet! */
wait until (TXBUFE = '0' and ENDTX = '0')
/* your code thinks PDC is done here */
/* but in reality, PDC is getting started */
disable tx requests
return from sub-function
overwrite stack (and arr) with unrelated data here
/* PDC might push out last word(s) here due to pipelining/ */
/* instruction cache/side effects/you-name-it */
/* even though its matrix requests were disabled a few cycles ago */
解决方案:
理想情况下,您将为字符串分配一些动态内存,并在PDC与您的实际代码异步完成后取消分配它。您可能想要检查PDC /外设完成后是否可以获得某种中断,然后释放它读取的内存。
如果你没有动态内存分配,那么使用全局环形缓冲区并抽象你的字符串/字符发送函数来代替使用这个缓冲区。