原创 串口收发总结(转载)

2009-9-20 18:28 4772 4 4 分类: MCU/ 嵌入式


   串口的问题是我之前做过的那个项目的一个比较重点的问题,之前的文章里也说过了不少,这里就主要说一下他的流程好了。


    首先需要明确的是串口的任务只是有串口接收数据和串口发送数据两个部分(可能有的朋友会觉得这是一句废话,但是这两个部分是有区别的)。在串口接收数据的这个部分有两种方法——查询法和中断法,查询法就是要串口一直处于等待的状态,看串口上是不是有数据(主要是看URX0IF的值,一旦是1,表示串口上有数据并且串口上的数据已经接收完毕可以进行下一步的操作了)一旦数据接收完毕,就开始对接收的数据进行相应的操作。这个方法需要让程序一直等待串口,所以个人觉得效率还是比较的低的,不过通过使用发现这种方法的稳定性还是比较的高的(我曾经做出过正确率基本是100%的串口来),所以个人建议就是如果你做的项目里只有与串口相关的工作的话,那么还是用查询的比较的好。还有一种方法就是中断法,这种方法是运用的串口中断服务子程序(ISR)来完成的,如果串口上有值的话,那么会调用中断向量,中断向量则把程序指针指到相应的ISR中去。对接收到的数据的操作在ISR中进行,ISR完成之后程序指针会跳回中断前的地方继续进行刚才被中断的事情,中断法就是这么一个流程了。这种方法的效率比较的高,而且程序不需要一直的等待串口,但是个人认为这种方法的稳定性不如查询的方式,出错率比较的高。不过如果你想要完成更多的工作的话,这种方法还是比较的适用的。说了这么多理论的问题,现在举几个例子吧。


    先看一个查询法的程序段


   void UartRX_Send_String(char *Data,int len)
   {
    int j;
    for(j=0;j<len;j++)
    {
       U0DBUF = *Data++;
       while(URX0IF == 0);
       URX0IF = 0;
     }
   }


    这个程序就是比较典型的一个查询法的程序,一直都是在查看URX0IF的状态。在接收完一个8bit的数据后,需要软件将URX0IF的标志位置0,等待下一个收据。  


   #pragma vector = URX0_VECTOR
  __interrupt void URX0_ISR(void){


      uarttemp = U0DBUF;
      U0DBUF = uarttemp;
   
}


    而这个程序就是比较典型的一个中断法的程序,上面的程序断是中断向量里的程序。将串口的值读出后再回显,串口有数据的时候就回调用这个ISR,然后执行里面的程序。


    对于串口发送数据的方法,我很遗憾的说只有一种方法,那就是查询法。发送数据的查询法和接收数据的查询法基本上是一样的,这里就不再多说了。只是给大家一个例子看一下吧。


void UartTX_Send_String(char *Data,int len)
   {
    int j;
    for(j=0;j<len;j++)
    {
       U0DBUF = *Data++;
       while(UTX0IF == 0);
       UTX0IF = 0;
     }
   }


    这个程序就是串口发送数据的典型程序。怎么样?是不是和接受的部分很相近呢?


    好了,我觉得串口收发的部分就是总结到这里就好了,不过我要提醒刚刚开始做串口的朋友们,串口的部分说起来是比较的简单的,但是你要是完全的做好小问题还是很多的,不是那么简单的。所以请大家不用很心急的,心急吃不了热豆腐003.gif


  


文章引自阿元的博客:http://blog.sina.com.cn/s/articlelist_1283622691_8_1.html


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条