读书人

串口有关问题了解串口或串口高手必进

发布时间: 2013-04-20 19:43:01 作者: rapoo

串口问题,了解串口或串口高手必进

新 唐 的 ARM M0 核,在 处理 串口 时 发现 一个 问题,很 困惑!
当 串口 收一个 字节,就 发一个 字节的时 候串 口没问题!
当 串口 直接 发 送一串 字符串,字符串的长度 不超过1 0个bye,没问题!

当串 口发送比 较长的字 串时,串口 助手 只能接收 到一部分! 例如 以下 程序:
发送:abcd efgh ijklmn opqrstu wxyz1234567890\n
却只能接收到:abcd efghi jklmnop

当调试 程序,单步走的 时候 可以完全 发出去,全速 的情况 下就会 少一部分,波特率 设为9600 或者115200 情况都一样,求高手 指点!


// 发送 调用 函数
void UART_Send_String(char part,char* string)
{
switch(part)
{
case 0:
while(*string)
{
_UART_SENDBYTE(UART0,*string);
string++;
}
break;
case 1:
while(*string)
{
_UART_SENDBYTE(UART1,*string);
string++;
}
break;
}
}


//以 下在 main 程序 中:
while(1)
{
//_UART_SENDBYTE(UART0,0x10);
//UART_Send_String(0,a);
for(i=0;i<999;i++)
for(j=0;j<999;j++);
P4->DOUT = 0x0ul;
for(i=0;i<999;i++)
for(j=0;j<999;j++);
P4->DOUT = 0x7ul<<1;
UART_Send_String(1,"abcdefghijklmnopqrstuvwxyz1234567890\n");
}
ARM 单片机 串口 串口通信
[解决办法]
我这的DrvUART.c,nuvoton提供的


/*---------------------------------------------------------------------*/
/* Function: DrvUART_Write */
/* */
/* Parameter: */
/* u32Port -[in] UART Channel: UART_PORT0 / UART_PORT1 /UART_PORT2 */


/* pu8RxBuf -[in] Specify the buffer to send the data to transmission FIFO. */
/* u32ReadBytes -[in] Specify the byte number of data. */
/* Returns: */
/* E_SUCCESS */
/* */
/* Description: */
/* TThe function is to write data to TX buffer to transmit data by UART */
/* Note: */
/* In IrDA Mode, the BAUD RATE configure MUST to use MODE # 0 */


/*---------------------------------------------------------------------*/
int32_t DrvUART_Write(E_UART_PORTu32Port,uint8_t*pu8TxBuf, uint32_t u32WriteBytes)
{
uint32_t u32Count, u32delayno;

UART_T * tUART;

tUART = (UART_T *)((uint32_t)UART0 + u32Port);

for (u32Count=0; u32Count<u32WriteBytes; u32Count++)
{
u32delayno = 0;
while (tUART->FSR.TE_FLAG !=1) /* Wait Tx empty and Time-out manner */
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;

}
tUART->DATA = pu8TxBuf[u32Count];/* Send UART Data from buffer */
}

return E_SUCCESS;


}


[解决办法]
填入串口数据寄存器之后,查串口状态寄存器,等待第一个数据发送完了,再送第二个数据;
------------------------------------------------------------
电子技术软件硬件交流群,142282597,欢迎网友进来交流,进群请修改网名,网名格式“所在地+昵称”,群宗旨“文明交流,相互提高”
[解决办法]
这既是库函数害人啊。
有的库函数里面跟军去看看函数原型机就知道了。

我刚刚用过M0516,上传几行代码:


//发送定长的字符串
void Send_String_To_PC (uint8_t *p,char length)
{
while(length --)
{
CONFIG_Send_Data_To_PC(*p ++);
//p++;
}
}

/***************************************************************************************
参数 : c: 要发送到字符
描述: 发送一个字符到PC
****************************************************************************************/
void CONFIG_Send_Data_To_PC (uint8_t c)
{
while((UA0_FSR&TX_FULL) != 0); //发送FIFO满时等待
UA0_THR = (uint8_t) c; //通过UART发送一个字符
}


[解决办法]
1. 可以在线调试的话,全速运行出现问题后,暂停查看当时的UART的状态寄存器状态,如发现错误,则对相应错误进行相应处理;
2. 在_UART_SENDBYTE()函数中,每次发送数据进行判断当前发送缓冲器是否为空;
3. 在_UART_SENDBYTE()函数中,发送每个数据后,可适当加一段延时试试;
[解决办法]
断点到进行SEND_UART这个函数中,看传进来的参数有没有问题,另外,这个函数的接口看似简单,其实埋有隐患,在该函数体内并不知道数据的正确性。

读书人网 >单片机

热点推荐