Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: tracking_ball_0516 tracking_ball_0516
Diff: Serial_Transport.cpp
- 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