CN101719774B - 一种基于融合通信终端蓝牙串口实现的方法 - Google Patents

一种基于融合通信终端蓝牙串口实现的方法 Download PDF

Info

Publication number
CN101719774B
CN101719774B CN2009102632683A CN200910263268A CN101719774B CN 101719774 B CN101719774 B CN 101719774B CN 2009102632683 A CN2009102632683 A CN 2009102632683A CN 200910263268 A CN200910263268 A CN 200910263268A CN 101719774 B CN101719774 B CN 101719774B
Authority
CN
China
Prior art keywords
data
frame
bluetooth
pointer
receives
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN2009102632683A
Other languages
English (en)
Other versions
CN101719774A (zh
Inventor
裴文江
张金玺
王开
孙庆庆
夏然辉
洪松
王毛
葛俊
任梦琪
孙龙
吴帆扬
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Southeast University
Original Assignee
Southeast University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Southeast University filed Critical Southeast University
Priority to CN2009102632683A priority Critical patent/CN101719774B/zh
Publication of CN101719774A publication Critical patent/CN101719774A/zh
Application granted granted Critical
Publication of CN101719774B publication Critical patent/CN101719774B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Communication Control (AREA)
  • Mobile Radio Communication Systems (AREA)

Abstract

本发明提供一种基于融合通信终端蓝牙串口实现的方法,接收数据的步骤为:蓝牙通过串口接收数据分为两次,第一次接收一个数据,第二次将剩余的数据全部接收;返回均是接收到的数据的首地址。发送数据则是通过void SendDataToArm(char*temp)函数实现,将需要发送的数据temp通过该函数将其发送出去。本发明能流畅的实现其他微处理器与蓝牙模块的串口通信,蓝牙设备通过其串口与其他设备或处理器相连接,可以自由的收发数据,同时,本发明支持应用程序实现不同的蓝牙应用框架,实现支持各种硬件和操作系统的移植性强的应用程序,任何扩展多不会影响应用程序本身,填补了蓝牙技术领域的空缺。

Description

一种基于融合通信终端蓝牙串口实现的方法
技术领域
本发明涉及一种蓝牙串口驱动实现的方法,属于蓝牙技术领域。
背景技术
目前蓝牙的应用逐渐普遍,蓝牙网关的产品也屡见不鲜。但就蓝牙产品技术的公开性,以及不同厂家对于蓝牙网关的技术实现上来说,产品技术基本保密,实现的方案也各有高低。基于蓝牙网关的实现,蓝牙串口驱动是必备的。实现蓝牙芯片与设备问的串口通信,是蓝牙网关开发的必备环节,通过该串口驱动的数据通信,实现蓝牙网关的状态切换。但在蓝牙应用的大环境里,没有统一的关于蓝牙串口驱动技术的实现方案。
发明内容
发明目的:
本发明的目的是针对现有技术的空白,提出基于蓝牙芯片的统一的蓝牙串口驱动技术的实现方案,对蓝牙连接的操作标准控制接口。实现蓝牙芯片与具有串口的设备(例如:电脑,ARM等)之间的串口通信,通过蓝牙芯片与具有串口的设备(例如:电脑,ARM等)之间的串口的直接连接。
技术方案:
该技术通过蓝牙芯片提供的串口与其他设备相连,可向其他设备传输数据或者接收从其他设备传来的数据。蓝牙芯片通过发送指定的数据通知其他设备(例如:电脑,ARM等)其消息映射的各个环节,通过接收其他设备(例如:电脑,ARM等)的数据指令,实现蓝牙不同功能(例如:蓝牙耳机,文件传输等)之间的切换。
本方案的实现,是基于Bluelab上的应用。蓝牙相关的每一个数据流都会对应于一个sink和一个source。蓝牙将接收的外部数据放入source里,而要向外发送的数据是放入sink里发送。蓝牙串口驱动技术就是这样的一个应用。蓝牙串口对应的soure和sink分别是StreamUartSource()和StreamUartSink()。StreamUartSource()是存储从外部设备(例如:电脑,ARM等)传来的数据,而要发送出去的数据是需要先写入到StreamUartSink()中,然后发送出去。
一种基于融合通信终端蓝牙串口实现的方法,
(一)接收数据的步骤为:
蓝牙通过串口接收数据分为两次,第一次接收一个数据,第二次将剩余的数据全部接收;
A、程序运行,判断接收到数据的个数,当个数为零则结束返回;当个数为1时,执行B步骤;当个数大于或等于为2时,执行C~D步骤;
B、当接收到的数据个数为1,则对接收到的数据进行提取:先将该接收到的数据申请的指针所指向的内存空间清空,接着将接收到的数据映射出来,并将其拷贝给已清空的存放数据的指针,最后返回获取一个数据的首地址;
C、对接收到的数据进行提取:接收第一个数据时,先将该接收到的数据申请的指针所指向的内存空间清空,接着将接收到的数据映射出来,并将其拷贝给已清空的存放数据的指针,同时指针加一;
D、接收剩余数据时,将该剩余数据映射并拷贝给该指定的指针,清空该指针所指向的内存空间,最后返回获取两个或两个以上数据的首地址;
返回均是接收到的数据的首地址;
(二)发送数据的步骤为:
E、程序运行后,使用StreamDisconnect()函数将串口的Source与Sink断开;
F、将声明的Sink型变量sink指向StreamUartSink(),并通过SinkClaim()函数获得偏移量;
G、将指定的指针指向Sink,然后将需要发送的数据拷贝给偏移了offset的指定的指针;
H、通过SinkFlush()函数更新StreamUartSink()的内容;
J、发送数据成功,结束返回。
有益效果:
本发明能流畅的实现其他微处理器与蓝牙模块的串口通信,蓝牙设备通过其串口与其他设备或处理器相连接,可以自由的收发数据。
同时,本发明支持应用程序实现不同的蓝牙应用框架,实现支持各种硬件和操作系统的移植性强的应用程序,任何扩展多不会影响应用程序本身,填补了蓝牙技术领域的空缺。
附图说明
图1是本发明中蓝牙模块与微处理器的简单连接图。
图2是本发明中接收一个数据的流程图。
图3是本发明中接收两个数据的流程图。
图4是本发明中接收两个以上数据的流程图。
图5是本发明中发送数据的流程图。
具体实施方式
下面结合附图对本发明的技术方案进行详细说明:
本方案的实现,是基于Bluelab上的应用。蓝牙相关的每一个数据流都会对应于一个sink和一个source。蓝牙将接收的外部数据放入source里,而要向外发送的数据是放入sink里发送。蓝牙串口驱动技术就是这样的一个应用。蓝牙串口对应的soure和sink分别是StreamUartSource()和StreamUartSink()。StreamUartSource()是存储从外部设备(例如:电脑,ARM等)传来的数据,而要发送出去的数据是需要先写入到StreamUartSink()中,然后发送出去。
接收外部数据的实现细则如下:蓝牙通过串口接收数据分为两次,第一次接收一个,第二次将剩余的数据全部接收。针对该情况,该发明提供了接收外部数据的三个函数,分别为接收一个数据的函数char * RevOneDateFromOut(void);接收两个数据的函数char * RevTwoDateFromOut(void);和接收两个以上的数据的函数char *RevMorethanTwoDateFromOut(void);返回均是接收到的数据的首地址。
发送数据则是通过void SendDataToArm(char *temp)函数实现,将需要发送的数据temp通过该函数将其发送出去。
先声明全局变量并申请一块内存空间:
int* dest_uart;
int* report_data_uart;
int Uartmalloc(int size)
{
  dest_uart=(int *)malloc(size * sizeof(int));
  if(NULL==dest_uart)
  {
      printf(″Uartmalloc error\n″);
      return-1;
  }
  memset(dest_uart,0,size * sizeof(int));
  report_data_uart=dest_uart;
  return 0;
}
接收一个数据:
char * RevOneDateFromOut(void)
 {
uint16 packet_size;
if((packet_size=SourceBoundary(StreamUartSource()))!=0)
{
if((packet_size==1))
{
memset(dest_uart,0,100 * sizeof(int));
memcpy(dest_uart,SourceMap(StreamUartSource()),packet_size);
SourceDrop(StreamUartSource(),packet_size);
return((char *)dest_uart);
}
}
return NULL;
}
程序运行,通过SourceBoundary()函数来判断StreamUartSource()里接收到数据的个数,是零则返回NULL,零则说明已经接收到数据,如果数据个数为一,则对接收到的数据进行提取。提取过程就是将该数据放入指定的存放数据的指针里。具体有,先将申请的指针所指向的内存空间清空,此时用到memset()函数,然后用SourceMap()函数将接收到的数据映射出来,并将其拷贝给存放数据的指针,接着用SourceDrop()将StreamUartSource()清空,最后返回获取一个数据的首地址。其流程图见图2所示。
接收两个数据:
char * RevTwoDateFromOut(void)
{
uint16 packet_size;
if((packet_size=SourceBoundary(StreamUartSource()))!=0)
{
if((packet_size==1)&&((dest_uart==NULL)||((dest_uart+2)==NULL)))
{
memset(report_data_uart,0,100 * sizeof(int));
dest_uart=report_data_uart;
memcpy(dest_uart,SourceMap(StreamUartSource()),packet_size);
SourceDrop(StreamUartSource(),packet_size);
dest_uart=dest_uart+packet_size;
}
else if((packet_size==1)&&dest_uart!=NULL)
{
     memcpy(dest_uart,SourceMap(StreamUartSource()),packet_size);
SourceDrop(StreamUartSource(),packet_size);
return((char *)report_data_uart);
}
}
return NULL;
}
程序运行,通过SourceBoundary()函数来判断StreamUartSource()里接收到数据的个数,是零则返回NULL,非零则说明已经接收到数据,则对接收到的数据进行提取。提取过程就是接收两个数据的第一个数据时,通过判断该数据个数是否为一,并且存放数据的指针是空(表示没有存放过数据)或者存放数据的指针里有两个数据(表示将前一次的两个数据接收完毕),则将存放数据的指针清空,并通过SourceMap()函数将接收到的数据映射出来,并将其拷贝给已清空的存放数据的指针,同时指针加一。接收两个数据的第二个数据时,通过判断该数据个数是否为一,并且存放数据的指针里已经存放有第一个数据,则将该数据映射并拷贝给该指定的指针,接着用SourceDrop()将StreamUartSource()清空,最后返回获取两个数据的首地址。其流程图见图3所示。
接收两个以上的数据:
char * RevMorethanTwoDateFromOut(void)
{
uint16 packet_size;
if((packet_size=SourceBoundary(StreamUartSource()))!=0)
{
if((packet_size==1))
{
memset(report_data_uart,0,100 * sizeof(int));
dest_uart=report_data_uart;
memcpy(dest_uart,SourceMap(StreamUartSource()),packet_size);
SourceDrop(StreamUartSource(),packet_size);
dest_uart=dest_uart+packet_size;
}
else
{
memcpy(dest_uart,SourceMap(StreamUartSource()),packet_size);
SourceDrop(StreamUartSource(),packet_size);
return((char *)report_data_uart);
}
}
return NULL;
}
程序运行,通过SourceBoundary()函数来判断StreamUartSource()里接收到数据的个数,是零则返回NULL。非零则说明已经接收到数据,则对接收到的数据进行提取。提取过程就是接收第一个数据时,通过判断该数据个数是否为一,是一则将存放数据的指针清空,并通过SourceMap()函数将接收到的数据映射出来,并将其拷贝给已清空的存放数据的指针,同时指针加一。接收剩余数据时,通过判断该数据个数不只一个,将剩下的接收到的数据映射并拷贝给该指定的指针,接着用SourceDrop()将StreamUartSource()清空,最后返回获取两个以上数据的首地址。其流程图见图4所示。
发送数据:
    void SendDataToArm(char *temp)
    {
       Sink sink;
       uint16 offset;
       uint8 *dest;
       const char *string=temp;
       uint16 length=strlen(string);
    StreamDisconnect(StreamUartSource(),StreamSinkFromSource(StreamUartSour
ce()));
       StreamDisconnect(StreamSourceFromSink(StreamUartSink()),
StreamUartSink());
       sink=StreamUartSink();
       PanicNull(sink);
      offset=SinkClaim(sink,length);
       if(offset==0xFFFF)Panic();
       dest=SinkMap(sink);
       (void)PanicNull(dest);
       memcpy(dest+offset,string,length);
       PanicZero(SinkFlush(sink,length));
    }
发送数据:
程序运行后,使用StreamDisconnect()函数将串口的Source与Sink断开,接着将声明的Sink型变量sink指向StreamUartSink(),并通过SinkClaim()函数获得偏移量。将指定的指针指向Sink,然后将需要发送的数据拷贝给偏移了offset的指定的指针,最后通过SinkFlush()函数更新StreamUartSink()的内容,实现数据的发送。其流程图见图5所示。

Claims (1)

1.一种基于融合通信终端蓝牙串口实现的方法,其特征在于:
(一)接收数据的步骤为:
A、程序运行,判断接收到数据帧的个数,当个数为零则结束返回;当个数为1时,执行B步骤;当个数大于或等于为2时,执行C~D步骤,蓝牙通过串口分两次接收数据帧:第一次接收一个数据帧,第二次将剩余的数据帧全部接收;
B、当接收到的数据帧个数为1,则对接收到的数据帧进行提取:先将该接收到的数据帧申请的指针所指向的内存空间清空,接着将接收到的数据帧映射出来,并将其拷贝给已清空的存放数据帧的指针,最后返回获取一个数据帧的首地址;
C、对接收到的数据帧进行提取:接收第一个数据帧时,先将该接收到的数据帧申请的指针所指向的内存空间清空,接着将接收到的数据帧映射出来,并将其拷贝给已清空的存放数据帧的指针,同时指针加一;
D、接收剩余数据帧时,将该剩余数据帧映射并拷贝给该存放数据帧的指针,清空该指针所指向的内存空间,最后返回获取两个或两个以上数据帧的首地址;
返回均是接收到的数据帧的首地址,即数据存储在本地内存的首地址;
(二)发送数据的步骤为:
E、程序运行后,使用StreamDisconnect()函数将串口的源端和目标端断开;
F、将声明的Sink型变量sink指向StreamUartSink(),并通过SinkClaim()函数获得偏移量;
G、将指定的指针指向目标端,然后将需要发送的数据拷贝给偏移了offset的指定的指针;
H、通过SinkFlush()函数更新StreamUartSink()的内容;
J、发送数据成功,结束返回;
其中StreamDisconnect()函数是用于断开主端Sourse端和从端Sink端的连接;StreamUartSink()函数是用于定义蓝牙串口的从端Sink端;SinkClaim()是为了发送断开Sink端分配Length长度的内存,然后判断是否分配成功,若分配成功,则将该内存赋值;SinkFlush()是用于将Sink端Length长度的数据发送出去,这样才能将Sink端的发送指针转移到正确位置,否则下次通过SinkClaim()为Sink分配内存,通过SinkFlush()发送时,将会出现通道上的发送数据使用上次分配的内存数据,从而造成后面一连串发送错误。
CN2009102632683A 2009-12-17 2009-12-17 一种基于融合通信终端蓝牙串口实现的方法 Expired - Fee Related CN101719774B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009102632683A CN101719774B (zh) 2009-12-17 2009-12-17 一种基于融合通信终端蓝牙串口实现的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009102632683A CN101719774B (zh) 2009-12-17 2009-12-17 一种基于融合通信终端蓝牙串口实现的方法

Publications (2)

Publication Number Publication Date
CN101719774A CN101719774A (zh) 2010-06-02
CN101719774B true CN101719774B (zh) 2013-09-25

Family

ID=42434299

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009102632683A Expired - Fee Related CN101719774B (zh) 2009-12-17 2009-12-17 一种基于融合通信终端蓝牙串口实现的方法

Country Status (1)

Country Link
CN (1) CN101719774B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102394942A (zh) * 2011-08-08 2012-03-28 北京登合科技有限公司 一种自动安装蓝牙串口设备的方法
CN116458825A (zh) * 2020-04-30 2023-07-21 深圳硅基智控科技有限公司 用于胶囊内窥镜的通信装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1812404A (zh) * 2005-01-24 2006-08-02 艾威梯软件技术(北京)有限公司 蓝牙rfcomm协议增速方法
CN101350832A (zh) * 2008-08-29 2009-01-21 深圳华为通信技术有限公司 一种数据通信的方法、通讯设备、终端和通信系统

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1812404A (zh) * 2005-01-24 2006-08-02 艾威梯软件技术(北京)有限公司 蓝牙rfcomm协议增速方法
CN101350832A (zh) * 2008-08-29 2009-01-21 深圳华为通信技术有限公司 一种数据通信的方法、通讯设备、终端和通信系统

Also Published As

Publication number Publication date
CN101719774A (zh) 2010-06-02

Similar Documents

Publication Publication Date Title
US20210004191A1 (en) Message passing framework for audio/video streaming in a topology of devices
CN104322033B (zh) 使用第二协议的扩展功能结构来控制第一协议的物理链路
CN103202091B (zh) 在无线接口上映射显示端口的方法和系统
EP1750401B1 (en) USB 1.1 over a high speed link
CN102648455B (zh) 服务器和流控制程序
CN101246678B (zh) 多屏实时信号处理的方法、系统
CN105959288A (zh) 一种电力电网系统中的网络协议转换及其相互通讯方法
CN104965700B (zh) VxWorks操作系统下实现驱动SPI设备的方法和系统
CN105531684A (zh) 通用pci express端口
CN103049240B (zh) Pci-e设备及其接收数据重排序方法
CN101849230A (zh) 在多主机环境中共享遗留设备
CN105765550A (zh) 经由总线上的附加副数据线来发送数据的系统和方法
CN103827841A (zh) 可配置带宽的io连接器
CN105553889A (zh) 一种内核网桥下物理网卡和虚拟网卡快速收发包传递方法
WO2023115852A1 (zh) 基于pcie的通信方法、装置、计算机设备和可读存储介质
CN103051716A (zh) 一种面向网络的串口设备重定向的方法及系统
CN101719774B (zh) 一种基于融合通信终端蓝牙串口实现的方法
CN100464535C (zh) 一种路由器虚拟驱动模块的动态加载与控制方法
CN101741765A (zh) 车载网关
CN104484205B (zh) 一种io设备固件的升级装置及方法
CN101383788B (zh) 一种FlexRay-RS485通信网关及实现方法
CN102802211B (zh) 通过共享无线资源增强功能的技术
CN104424141A (zh) 用于io和入站av的拓扑和带宽管理
CN101175073A (zh) 基于硬盘控制器的双控制器通讯系统及其方法
CN102780503A (zh) 基于cpci总线的具有多种传输手段的音频和数据转发装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20130925

Termination date: 20161217