串口通讯

来源:互联网 发布:淘宝怎么搜精仿手表 编辑:程序博客网 时间:2024/04/30 08:47


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

    首先需要明确的是串口的任务只是有串口接收数据和串口发送数据两个部分(可能有的朋友会觉得这是一句废话,但是这两个部分是有区别的)。在串口接收数据的这个部分有两种方法——查询法和中断法,查询法就是要串口一直处于等待的状态,看串口上是不是有数据(主要是看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;
     }
   }

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

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


电梯直达:基于ZigBee2006协议的串口收发程序解读

http://blog.sina.com.cn/s/blog_4c8287230100cyfk.html

已经很久没有发布自己编写的程序了,最近受群里朋友的邀请在做一个串口的小程序,呵呵,其实就是CC2430在06协议中的串口接收程序。今天我就简单的做了一个小小的实验:按键初始化串口后,从串口调试助手上向芯片发送数据(每次发送8位数据),调试助手上回显发出的数据。借着这个实验,我解读一下06协议中的串口的使用。先发一张成功后的截图给大家一点信心!!

[转载]基于ZigBee2006协议的串口收发程序解读

     首先我想说的是06协议和之前的04协议中串口程序的区别。在06协议里,由于OSAL的引入,所有的函数均是采用调用形式,也就是说,跳来跳去的程序要比之前多了很多。串口部分也不例外,之前我总结的串口的中断法现在在06协议中已经变成了回调函数形式。也就是说,一旦串口有数据传送的时候,OSAL会就自动的转到你自定义的回调函数,执行你自定义的操作。不过这个需要你提前进行设置,现在大家看一下我的设置(见下图)。

[转载]基于ZigBee2006协议的串口收发程序解读     注意最下面的uartConfig.callBackFunc = testCB就是自定义的回调函数(系统默认NULL),而testCB就是我自定义的程序。不过需要提醒大家的是:这些函数需要自己放在之前系统的任务初始化函数(SampleApp_Init( uint8 task_id ))里(谢谢瞎蒙!!),由于我是按键进行串口初始化,所以我就把这部分程序放在按键程序里了。

     现在我们来介绍第二步,就是更改串口的一下设置(如下图):

    [转载]基于ZigBee2006协议的串口收发程序解读

      这一部分的代码在文件 hal_board_cfg.h中,大家可以改一下,没有什么好说的,就是一些串口的基本设置。最后就来看看我这个超级简单的串口回调函数吧:

void testCB (uint8 port,uint8 event)
{
  uint8 temp[8];
  HalUARTRead(HAL_UART_PORT_0,temp,8);    //芯片通过串口读数据
  HalUARTWrite(HAL_UART_PORT_0,temp, 8);  //芯片通过串口向外写数据

}

    不知道为什么?之前必须有一个声明,估计是我把它写在所有文件的最后的原因吧,好了,整个06里的串口回调就是这么的简单。最后谢谢群里的瞎蒙!!

 

本文是作者原创,程序摘自无限龙ZigBee06协议栈(ZStack-1.4.3),转载必须保证文章的完整性并标明出处,请尊重作者,支持原创。

 

电梯直达:CC2430基础实验——串口收发总结

http://blog.sina.com.cn/s/blog_4c8287230100ay0n.html


0 0
原创粉丝点击