He Zhiqing / existing_references

Dependents:   tracking_ball_0516 tracking_ball_0516

Revision:
0:7f16c88e4047
Child:
1:09e2d1034894
diff -r 000000000000 -r 7f16c88e4047 Serial_Transport.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Serial_Transport.cpp	Sun May 16 12:22:23 2021 +0000
@@ -0,0 +1,210 @@
+#include "mbed.h"
+#include "Serial_Transport.h"
+
+
+//串口通讯子程序
+
+////设置环形数组结构
+//#define RECV_BUFFER_SIZE 100
+//typedef struct {
+//   unsigned char Recv_Buffer[RECV_BUFFER_SIZE];  //接收缓存,用于存储接受的数据
+//   unsigned char Write_Index;      //写入位置(缓存区可写入数据的数组位置索性)
+//   unsigned char Read_Index;   //读取位置 (缓存区可以待读取数据的数组索引) 
+//    
+//}  Circle_Struct;
+//
+////设计,
+////写入数据:当接受到数据时,若Write_Index==Read_Index,表示数组已满,不能写入,需等待读出。若不相等,则写入Write_Index开始的数组,每完成一个字符的写入,Write_Index加1后取余为新的Write_Index。若Write_Index==Read_Index,则表示队列已满,溢出。
+////读取数据:从数组的Read_Index开始读取数据,若Read_Index==Tail_Index,表示数组的数据为空(或已读完),停止读出。若不相等,则读一个字符,然后Read_Index加1后取余为新的Read_Index。
+//
+////相关程序
+////声明环形数组
+//Circle_Struct  circle_Struct;
+//unsigned char state=0;
+//unsigned char count;
+
+
+
+void Serial_Porting_Init()
+{
+    openmv_port.baud(115200);
+    openmv_port.format(8, SerialBase::None, 1);   
+    pc.printf("Serial init successful\n");
+    
+}
+
+
+//初始化
+void Init_Circle_Struct(Circle_Struct * pcs)
+{
+   pcs->Write_Index=1;
+   pcs->Read_Index= 0;   
+   pcs->Recv_Buffer[0]='\0';  //第一个单元设置为结束符
+}
+
+//对环形数组的操作
+//判断是否为空
+unsigned char IsEmputy(void)
+{
+  //
+       return circle_Struct.Write_Index==circle_Struct.Read_Index?1:0;
+  //
+}
+//写一个数据到环形数组
+void Write_To(unsigned char infor)
+{
+   unsigned char tem;
+   //下一个写入位置。保持同Read_Index的距离
+  tem=(circle_Struct.Write_Index+1)%RECV_BUFFER_SIZE;  
+  while(tem==circle_Struct.Read_Index)
+  {   
+       wait(0.100); 
+  }
+
+   //赋值      
+  circle_Struct.Recv_Buffer[circle_Struct.Write_Index]=infor;
+  //修改Write_Index,   
+  circle_Struct.Write_Index=tem;        
+}
+
+//从环形数组读取一个数据
+//返回值:0表示没有读到数据,1:读到数据
+//读取的数据在*p.
+unsigned char Read_From(unsigned char *p)
+{
+   unsigned char result=0;
+   //环形缓冲数组是否为空
+   if(circle_Struct.Read_Index==circle_Struct.Write_Index)
+  {
+     //空
+     return result;
+  }    
+   //读取值
+  *p=circle_Struct.Recv_Buffer[circle_Struct.Read_Index];
+  //修改指针
+  circle_Struct.Read_Index=(circle_Struct.Read_Index+1)%RECV_BUFFER_SIZE;
+  //设置返回值
+  result=1;
+  return result;
+}
+
+//////////////////////////////////////////////////////////////
+//数据接收:
+//unsigned char Do_Recv(void)
+//{
+//  //临时存储接收的字符串
+//  unsigned  char buff[RECV_BUFFER_SIZE]; 
+//  unsigned char length;
+//  unsigned char i;
+//  while(true)
+//  {
+//   //
+//    if (openmv_port.readable() == true) 
+//    {
+//       //串口接收到数据,
+//       //设置buff[0]=”\0”;
+//        Buff[0]=”\0”;
+//       //先读取到临时存储区。
+//       openmv_port.gets(buff,RECV_BUFFER_SIZE);
+//       //获取实际读取的字符长度
+//       length=strlength(buff);
+//       //依次写入环形数组。     
+//      for(i=0;i<length;i++)
+//       {
+// 
+//         Write_To(buff[i]);  
+//      }
+//   }
+// }
+//}
+
+
+//采用中断方式接收串口信息,设置中断处理函数
+void Do_Recv(void)
+{
+  //临时存储接收的字符串
+    char buff[RECV_BUFFER_SIZE]; 
+    unsigned char length;
+   unsigned char i;  
+    //
+    if (openmv_port.readable() == true) 
+    {
+       //串口接收到数据,
+       //设置buff[0]=”\0”;
+        buff[0]='\0';
+       //先读取到临时存储区。
+       openmv_port.gets(buff,RECV_BUFFER_SIZE);
+       //获取实际读取的字符长度
+       length=strlen(buff);
+       //依次写入环形数组。     
+       for(i=0;i<length;i++)
+       {
+          //
+         Write_To(buff[i]);
+          // 
+        }
+     }
+}
+
+
+//处理接收到的数据,数据在环形缓存数组内
+//使用状态机,过滤出帧头,返回信息部分字符串。
+//输出:pinfor表示的信息字符串,返回值表示当前处理的状态  3:表示收到一个完整的信息。
+//
+unsigned char DealRecv( unsigned char * pinfor)
+{
+  //
+  unsigned char result=0;
+  unsigned char recv;
+  //
+  while(IsEmputy()==0)
+  {
+    result=Read_From(&recv);
+    //
+    if(result==0)  
+       return state; 
+
+  switch(state)
+  {
+    
+    case 0: //判断是否是帧头1
+        int count=0; 
+        if(recv==0x99)
+           state=1; 
+         break;
+   case 1: //判断是否是帧头2
+       if(recv==0x24)
+         {
+            state=2;
+            count=0;  //信息部分计数器初始化
+        }  
+       break;
+   case 2: //信息部分,存入数组
+         *pinfor=recv;
+          //是否是字符串结束符
+          if(recv==0x0a)
+          {
+            //           
+            state=3;
+          }  
+        else
+        {
+             count++;
+             pinfor++;
+        }
+       break;
+  } 
+   if(state==3)
+   {
+          
+       break;  
+    }
+ }
+
+return state;
+}
+
+void openmv_init(void)
+{
+    openmv_port.attach(&Do_Recv,SerialBase::RxIrq);
+}
\ No newline at end of file