CN101719774B - 一种基于融合通信终端蓝牙串口实现的方法 - Google Patents
一种基于融合通信终端蓝牙串口实现的方法 Download PDFInfo
- 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
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()发送时,将会出现通道上的发送数据使用上次分配的内存数据,从而造成后面一连串发送错误。
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)
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)
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 | 深圳华为通信技术有限公司 | 一种数据通信的方法、通讯设备、终端和通信系统 |
-
2009
- 2009-12-17 CN CN2009102632683A patent/CN101719774B/zh not_active Expired - Fee Related
Patent Citations (2)
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 |