132

帖子

0

TA的资源

一粒金砂(中级)

21
 
没有源码包吗?
此帖出自stm32/stm8论坛
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

22
 
六 通信部分



1. 结构体

通信中往往涉及到读写指针、接受缓冲等参数,但不通过通信涉及的缓冲大小是不同的,故这里是有指针实现,应用者在应用时需要定义缓冲区赋值给这个指针。此通信部分可以应用在任何使用中断接收,查询处理的地方,特别适合串口通信。

  1. /**************************************************************************************
  2. * Variable definition                                               
  3. **************************************************************************************/                                     
  4. #if (OS_CMM_MAX > 0)
  5. typedef struct
  6. {
  7.     U16 WCnt;                                                                        // 写指针
  8.     U16 RCnt;                                                                        // 读指针
  9.     U16 BSiz;                                                                        // 缓冲尺寸
  10.     U8  *RWBuf;                                                                        // 读写缓冲

  11. } OS_CMM_STR;                                                                   // 通讯

  12. OS_EXT OS_CMM_STR OSCmm[OS_CMM_MAX];
  13. #endif
复制代码


2. 初始化

初始化结构体中的变量。
  1. /**************************************************************************************
  2. * FunctionName   : OSCmmInit()
  3. * Description    : 初始化
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_CMM_MAX > 0)
  8. void OSCmmInit(void)
  9. {
  10.     for (U8 i=0; i<OS_CMM_MAX; i++)
  11.     {
  12.         OSCmm[i].WCnt  = 0x0000;                                                // 初始化计数器
  13.         OSCmm[i].RCnt  = 0x0000;
  14.         OSCmm[i].BSiz  = 0x0000;                                                //
  15.         OSCmm[i].RWBuf = NULL;                                                  //
  16.     }
  17. }
  18. #endif
复制代码


3. 创建通信

初始化和定义时并没有真正的缓冲,需要在定义缓冲区后,通过此函数实现连接创建,保证数据的正确存储。
  1. /**************************************************************************************
  2. * FunctionName   : OSCmmCreate()
  3. * Description    : 创建通信
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_CMM_MAX > 0)
  8. OS_BOOL OSCmmCreate(U8 num, U8 *pBuf, U16 bufSize)
  9. {
  10.     if (num >= OS_CMM_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_CCF;                                                // 通信创建错误
  13.         return OS_FALS;
  14.     }  
  15.   
  16.     OSCmm[num].WCnt  = 0x0000;                                                  // 初始化计数器
  17.     OSCmm[num].RCnt  = 0x0000;
  18.     OSCmm[num].BSiz  = bufSize;                                                 // 设置通信缓冲尺寸
  19.     OSCmm[num].RWBuf = pBuf;
  20.    
  21.     memset(OSCmm[num].RWBuf, 0, OSCmm[num].BSiz);                               // 清缓冲
  22.     return OS_TRUE;
  23. }
  24. #endif
复制代码


4. 数据接收

数据接收有按字节接收的,也有按多字节接收的,如果采用中断接收时,此函数放入中断接收处理中
  1. /**************************************************************************************
  2. * FunctionName   : OSCmmWriteByte()
  3. * Description    : 数据接收(接收中断调用)
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_CMM_MAX > 0)
  8. OS_BOOL OSCmmWriteByte(U8 num, U8 dat)
  9. {
  10.     if (num >= OS_CMM_MAX)
  11.     {
  12.         return OS_FALS;
  13.     }  
  14.    
  15.     OSCmm[num].RWBuf[OSCmm[num].WCnt] = dat;                                        // 数据存入
  16.    
  17.     if (++OSCmm[num].WCnt >= OSCmm[num].BSiz)                                        // 缓冲判断
  18.     {
  19.         OSCmm[num].WCnt = 0;
  20.     }
  21.    
  22.     return OS_TRUE;
  23. }
  24. #endif

  25. /**************************************************************************************
  26. * FunctionName   : OSCmmWriteNByte()
  27. * Description    : 数据接收多字节数据
  28. * EntryParameter : None
  29. * ReturnValue    : None
  30. **************************************************************************************/
  31. #if (OS_CMM_MAX > 0)
  32. OS_BOOL OSCmmWriteNByte(U8 num, U8 *pDat, U16 len)
  33. {
  34.     if (num >= OS_CMM_MAX)
  35.     {
  36.         return OS_FALS;
  37.     }
  38.    
  39.     for (U16 i=0; i<len; i++)
  40.     {
  41.         OSCmm[num].RWBuf[OSCmm[num].WCnt] = *(pDat+i);                                // 数据存入
  42.         
  43.         if (++OSCmm[num].WCnt >= OSCmm[num].BSiz)                                // 缓冲判断
  44.         {
  45.             OSCmm[num].WCnt = 0;
  46.         }
  47.     }
  48.    
  49.     return OS_TRUE;
  50. }
  51. #endif
复制代码


5. 读缓冲区

数据接收后,需要不断的去读取缓冲,把缓冲区的数据读取用于处理,可以按字节读取,也可以读取多字节
  1. /**************************************************************************************
  2. * FunctionName   : OSCmmReadByte()
  3. * Description    : 从接收缓冲中读取一字节数据
  4. * EntryParameter : None
  5. * ReturnValue    : 返回读取数据
  6. **************************************************************************************/
  7. #if (OS_CMM_MAX > 0)
  8. OS_BOOL OSCmmReadByte(U8 num, U8 *pDat)
  9. {
  10.     if (num >= OS_CMM_MAX)
  11.     {
  12.         return OS_FALS;
  13.     }
  14.    
  15.     *pDat = OSCmm[num].RWBuf[OSCmm[num].RCnt];                                  // 读取一字节
  16.     if (++OSCmm[num].RCnt >= OSCmm[num].BSiz)
  17.     {
  18.         OSCmm[num].RCnt = 0;                                                        // 清零
  19.     }
  20.    
  21.     return OS_TRUE;                                                                
  22. }
  23. #endif

  24. /**************************************************************************************
  25. * FunctionName   : OSCmmReadNByte()
  26. * Description    : 从接收缓冲中读取多字节数据
  27. * EntryParameter : None
  28. * ReturnValue    : 返回读取数据
  29. **************************************************************************************/
  30. #if (OS_CMM_MAX > 0)
  31. OS_BOOL OSCmmReadNByte(U8 num, U8 *pBuf, U16 len)
  32. {
  33.     if (num >= OS_CMM_MAX)
  34.     {
  35.         return OS_FALS;
  36.     }
  37.    
  38.     for (U16 i=0; i<len; i++)
  39.     {
  40.         *(pBuf+i) = OSCmm[num].RWBuf[OSCmm[num].RCnt];                                   
  41.         if (++OSCmm[num].RCnt >= OSCmm[num].BSiz)
  42.         {
  43.             OSCmm[num].RCnt = 0;                                                // 清零
  44.         }
  45.     }         
  46.    
  47.     return OS_TRUE;
  48. }
  49. #endif
复制代码


6. 获取缓冲区中数据长度

此函数获取的是缓冲区中还未处理的数据的长度
  1. /**************************************************************************************
  2. * FunctionName   : OSCmmGetLen()
  3. * Description    : 获取缓冲区中未读数据长度
  4. * EntryParameter : None
  5. * ReturnValue    : 返回数据长度
  6. **************************************************************************************/
  7. #if (OS_CMM_MAX > 0)
  8. S32 OSCmmGetLen(U8 num)
  9. {
  10.     if (num >= OS_CMM_MAX)
  11.     {
  12.         return OS_NOT;
  13.     }
  14.    
  15.     return ((OSCmm[num].WCnt >= OSCmm[num].RCnt) ?
  16.            ((OSCmm[num].WCnt - OSCmm[num].RCnt)) :
  17.            ((OSCmm[num].WCnt + OSCmm[num].BSiz) - OSCmm[num].RCnt));
  18. }
  19. #endif
复制代码



此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

1488

帖子

2

TA的资源

纯净的硅(中级)

23
 
支持 mark一下
此帖出自stm32/stm8论坛
 
个人签名专业从事于在线监测振动、转速、轴振动、位移等,设备管理及故障检测振动诊断系统在线监测点巡检系统-现场动平衡仪-测振仪、便携式测振仪
 

回复

1891

帖子

2

TA的资源

纯净的硅(中级)

24
 
楼主好厉害,,mark
此帖出自stm32/stm8论坛
 
个人签名
分享铸就美好未来。。。




 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

25
 
支持 ,
此帖出自stm32/stm8论坛
 
 
 

回复

862

帖子

2

TA的资源

纯净的硅(初级)

26
 
支持一下!!
此帖出自stm32/stm8论坛
 
个人签名水不撩不知深浅 人不拼怎知输赢
 
 

回复

1310

帖子

3

TA的资源

一粒金砂(高级)

27
 
加油,
此帖出自stm32/stm8论坛
 
个人签名

RTEMS

 
 

回复

6423

帖子

17

TA的资源

版主

28
 
楼主强大!!!!
有个疑问:没有看到优先级和中断的影子啊
此帖出自stm32/stm8论坛
 
个人签名training
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

29
 
"2. 每个任务划分一定的轮询时间,而运行时间是无法预知的。"

楼主 这句话可以这么理解吗,每个任务在某个相应的时间询问cpu是否空闲,然后是否运行有cpu决定?
此帖出自stm32/stm8论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

30
 
目前我接触到的OS基本上是抢占式的,楼主的这个我可以理解为平行的吗
此帖出自stm32/stm8论坛

点评

抢占就必须实现堆栈管理,一就是说必须涉及到汇编代码,这是我最不想看见的,而已这样的优秀系统已经不少了,没有必要自己再去写。我要的是简单的管理,能够实现不错的结果。  详情 回复 发表于 2014-12-12 08:14
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

31
 
dj狂人 发表于 2014-12-11 22:37
目前我接触到的OS基本上是抢占式的,楼主的这个我可以理解为平行的吗
抢占就必须实现堆栈管理,一就是说必须涉及到汇编代码,这是我最不想看见的,而已这样的优秀系统已经不少了,没有必要自己再去写。我要的是简单的管理,能够实现不错的结果。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

32
 
七 数据



        在很多时候,通信时都是一帧一帧的数据,但数据帧的格式确不尽相同,特别是使用串口通信时,每个人使用的协议也不尽相同。为此,想写一个标准的数据帧处理基本是不现实的。但,很多时候,我们会使用带1、2字节帧头或1、2字节帧尾的通信格式,例如GPRS基本为0x0D、0x0A两字节结束,而GPS则使用$为头,以0x0D、0x0A为尾的格式,对于类似的数据帧我们则可以编写出一个标准的处理代码,下面就针对这种格式编写。

1. 结构体

  1. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  2. typedef struct
  3. {
  4.     // 帧数据格式 [1-数据长度,2-第一字节数据,2-第二字节数据]
  5.     U8  Head[3];                                                                // 头数据
  6.     U8  Tail[3];                                                                // 尾数据
  7.   
  8.     //--------------------------------------------------------------------------
  9.     U8  HMrk;                                                                   // 头标志
  10.     U8  *RBuf;                                                                  // 帧接收缓冲
  11.     U16 RSiz;                                                                   // 帧接收缓冲大小
  12.     U16 RLen;                                                                   // 帧接收长度

  13. } OS_CMM_FRM;                                                                   // 帧         
  14. #endif
复制代码


2. 初始化帧格式

数据帧格式众多,需要处理那种格式,得先定义好
  1. /**************************************************************************************
  2. * frame data      
  3. **************************************************************************************/

  4. /**************************************************************************************
  5. * FunctionName   : OSCmmInitFrm()
  6. * Description    : 初始化帧
  7. * EntryParameter : pFrm - 帧缓冲
  8. * ReturnValue    : None
  9. **************************************************************************************/
  10. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  11. void OSCmmInitFrm(OS_CMM_FRM *pFrm, U8 *pHead, U8 *pTail)
  12. {
  13.     memcpy(pFrm->Head, pHead, 3);
  14.     memcpy(pFrm->Tail, pTail, 3);
  15. }
  16. #endif
复制代码


3. 创建帧缓冲

  1. /**************************************************************************************
  2. * FunctionName   : OSCmmCreateFrm()
  3. * Description    : 帧接收创建
  4. * EntryParameter : pFrm - 帧缓冲
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  8. void OSCmmCreateFrm(OS_CMM_FRM *pFrm, U8 *pBuf, U16 bufSize)
  9. {
  10.     pFrm->RLen = 0x0000;                                                        // 初始化计数器
  11.     pFrm->RSiz = bufSize;                                                       //
  12.     pFrm->RBuf = pBuf;
  13.    
  14.     memset(pFrm->RBuf, 0, pFrm->RSiz);                                          // 清缓冲
  15. }
  16. #endif
复制代码


4. 清空数据帧

  1. /**************************************************************************************
  2. * FunctionName   : OS_CmmClrFrm()
  3. * Description    : 清除接收缓冲
  4. * EntryParameter : pFrm - 帧缓冲
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  8. void OSCmmClrFrm(OS_CMM_FRM *pFrm)
  9. {
  10.     pFrm->HMrk = 0x00;
  11.     pFrm->RLen  = 0x0000;                                                       // 初始化计数器
  12.     memset(pFrm->RBuf, 0, pFrm->RSiz);                                          // 清缓冲
  13. }
  14. #endif
复制代码


5. 头尾判断

用于判断接收缓冲区中的,数据头和数据尾
  1. /**************************************************************************************
  2. * FunctionName   : OS_CmmHeadFrm()
  3. * Description    : 数据头处理
  4. * EntryParameter : pFrm - 帧缓冲,dat - 数据
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  8. void OS_CmmHeadFrm(OS_CMM_FRM *pFrm, U8 dat)
  9. {
  10.     if (dat == pFrm->Head[pFrm->HMrk+1])
  11.     {
  12.         pFrm->RBuf[pFrm->RLen++] = dat;
  13.         pFrm->HMrk++;
  14.     }
  15.     else
  16.     {
  17.         OSCmmClrFrm(pFrm);
  18.     }
  19. }
  20. #endif

  21. /**************************************************************************************
  22. * FunctionName   : OS_CmmTailFrm()
  23. * Description    : 数据尾处理
  24. * EntryParameter : pFrm - 帧缓冲
  25. * ReturnValue    : None
  26. **************************************************************************************/
  27. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  28. OS_BOOL OS_CmmTailFrm(OS_CMM_FRM *pFrm)
  29. {
  30.     if (pFrm->Tail[0] == 1)                                                   
  31.     {
  32.         if (pFrm->RBuf[pFrm->RLen-1] == pFrm->Tail[1])                          // 获取一帧数据
  33.         {
  34.             return OS_TRUE;
  35.         }
  36.     }
  37.     else if (pFrm->Tail[0] == 2)                                                // 两字节帧头
  38.     {
  39.         if ((pFrm->RBuf[pFrm->RLen-2] == pFrm->Tail[1]) &&                      // 获取一帧数据
  40.             (pFrm->RBuf[pFrm->RLen-1] == pFrm->Tail[2]))
  41.         {
  42.             return OS_TRUE;
  43.         }
  44.     }
  45.    
  46.     return OS_FALS;   
  47. }
  48. #endif
复制代码


6. 获取一帧数据

  1. /**************************************************************************************
  2. * FunctionName   : OS_CmmGetFrm()
  3. * Description    : 获取数据帧
  4. * EntryParameter : None
  5. * ReturnValue    : 获取一帧返回OS_TRUE,否则返回OS_FALS
  6. **************************************************************************************/
  7. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  8. OS_BOOL OS_CmmGetFrm(U8 num, OS_CMM_FRM *pFrm)
  9. {
  10.     U8  tmpDat;

  11.     for (U16 i=0; i<OSCmmGetLen(num); i++)                                        // 循环处理数据
  12.     {
  13.         if (OSCmmReadByte(num, &tmpDat) == OS_TRUE)                                // 读取一字节数据
  14.         {
  15.             if (pFrm->HMrk < pFrm->Head[0])                                     // 未读到头
  16.             {
  17.                 OS_CmmHeadFrm(pFrm, tmpDat);                                    // 头处理
  18.             }
  19.             else
  20.             {
  21.                 pFrm->RBuf[pFrm->RLen++] = tmpDat;                              // 数据存储
  22.                 if (OS_CmmTailFrm(pFrm) == OS_TRUE)                             // 尾处理
  23.                 {
  24.                     return OS_TRUE;
  25.                 }
  26.                
  27.                 if (pFrm->RLen > pFrm->RSiz)                                           // 越界判断
  28.                 {
  29.                     OSCmmClrFrm(pFrm);
  30.                 }
  31.             }
  32.         }
  33.     }

  34.     return OS_FALS;   
  35. }
  36. #endif
复制代码


7. 接收数据的处理

  1. /**************************************************************************************
  2. * FunctionName   : OSCmmRcvPro()
  3. * Description    : 接收数据处理
  4. * EntryParameter : pCmm - 接收,pFrm - 帧缓冲
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if ((OS_CMM_MAX > 0) && (OS_CMM_FRM_EN > 0))
  8. OS_BOOL OSCmmRcvPro(U8 num, OS_CMM_FRM *pFrm)
  9. {
  10.     while (OSCmm[num].RCnt != OSCmm[num].WCnt)                                  // 缓冲中有数据
  11.     {
  12.         if (OS_CmmGetFrm(num, pFrm) == OS_TRUE)
  13.         {
  14.             return OS_TRUE;
  15.         }
  16.     }
  17.    
  18.     return OS_FALS;
  19. }
  20. #endif

  21. /**************************************************************************************
  22. * end of file      
  23. **************************************************************************************/
复制代码


此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

391

帖子

1

TA的资源

一粒金砂(高级)

33
 
赞 最近刚好想提高一下软件设计水平  得静下心来好好跟楼主学习了
此帖出自stm32/stm8论坛
 
 
 

回复

2015

帖子

0

TA的资源

纯净的硅(中级)

34
 
受教了!支持楼主!
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

24

TA的资源

版主

35
 
要是楼主在做一个简单的上位机软件,用于自动配置参数、创建任务、查询状态等等,增加易用性,那样就更方便了。
此帖出自stm32/stm8论坛

点评

赞一个 楼上想法不错  详情 回复 发表于 2015-3-4 21:38
这个不错啊,不过没时间弄。。。。  详情 回复 发表于 2014-12-12 10:47

赞赏

1

查看全部赞赏

 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

36
 
dcexpert 发表于 2014-12-12 10:19
要是楼主在做一个简单的上位机软件,用于自动配置参数、创建任务、查询状态等等,增加易用性,那样就更方便了。
这个不错啊,不过没时间弄。。。。
此帖出自stm32/stm8论坛

点评

功能上应该没话说,足够强,但是大家接受它要一个过程,很多人不一定有时间去专门学习它。如果有一个简单化的工具,对使用和推广是有好处的。  详情 回复 发表于 2014-12-12 11:05
 
个人签名我的博客
 
 

回复

1万

帖子

24

TA的资源

版主

37
 
zhaojun_xf 发表于 2014-12-12 10:47
这个不错啊,不过没时间弄。。。。
功能上应该没话说,足够强,但是大家接受它要一个过程,很多人不一定有时间去专门学习它。如果有一个简单化的工具,对使用和推广是有好处的。
此帖出自stm32/stm8论坛

点评

恩,有时间可以考虑。。。。。。  详情 回复 发表于 2014-12-12 14:00
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

38
 
dcexpert 发表于 2014-12-12 11:05
功能上应该没话说,足够强,但是大家接受它要一个过程,很多人不一定有时间去专门学习它。如果有一个简单化的工具,对使用和推广是有好处的。
恩,有时间可以考虑。。。。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

39
 
楼主做的很不错,仔细看了一下,挺好了,而且楼主把软件开源,这一点值得广大电工学习,另外,《时间触发嵌入式系统设计模式》,我对比了一下楼主的思想,感觉楼主的框架与这本书介绍的类似,所以我建议,在时间片轮询的基础上,多做一下标准化的模块开发,这样对初始者,甚至广大小电工的工作都是一种启发,最后,再次感谢楼主的分享^_^
此帖出自stm32/stm8论坛

点评

回答的非常专一,感谢,后面将尽量把常用的东西模块化,并集成进来。  详情 回复 发表于 2014-12-12 19:41
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

40
 
星科尔 发表于 2014-12-12 17:27
楼主做的很不错,仔细看了一下,挺好了,而且楼主把软件开源,这一点值得广大电工学习,另外,《时间触发嵌入式系统设计模式》,我对比了一下楼主的思想,感觉楼主的框架与这本书介绍的类似,所以我建议,在时间片轮询的基础上,多做一下标准化的模块开发,这样对初始者,甚至广大小电工的工作都是一种启发,最后,再次感谢楼主的分享^_^
回答的非常专一,感谢,后面将尽量把常用的东西模块化,并集成进来。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表