首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

2013-04-20 
串口问题,了解串口或串口高手必进新 唐 的 ARMM0 核,在 处理 串口 时 发现 一个 问题,很 困惑!当 串口 收

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

新 唐 的 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这个函数中,看传进来的参数有没有问题,另外,这个函数的接口看似简单,其实埋有隐患,在该函数体内并不知道数据的正确性。

热点排行