微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 关于BLE UART方式连续发数据的Sleep Time 问题?

关于BLE UART方式连续发数据的Sleep Time 问题?

时间:10-02 整理:3721RD 点击:

TI 工程师:现在有个比较急的问题,用PC连接TI CC2540的USBdongle,连接我们公司自己的板子(上面是CC2541的串口透传模块),UART方式的连续得收发数据,

软件方面用C语言写的串口通信的方式;比如如果发送数据 的话会把命令头 01,12 ,FD,13...等写在数据之前发出去,每次最多发20个数据(不含命令头)

现在的话功能可以实现,问题是在发出一组数据后需要Sleep一段时间(比如100ms)才可以发下一组,否则的话很多数据会丢失,

这样带来的问题就是传输的效率非常低,9600波特率,1.5KBytes数据要发10几秒钟才能发完;

就想问下这个Sleep时间是怎么造成的?是不是我的Dongle的硬件有问题呢,还是其他方面(比如程序写法)的问题?谢谢!

------------------------------------------------------------------------------------------------

附上程序部分:

函数定义,串口发部分:

BOOL jeff_class::CMySerialPort::WriteCommByte ( unsigned char ucByte )
{
    BOOL bWriteStat;
    DWORD dwBytesWritten;

    bWriteStat = WriteFile ( m_hIDComDev, ( LPSTR ) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
 
    // 查询异步写入是否完成,未完成则挂起等待
    if ( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) ) {
        if ( WaitForSingleObject ( m_OverlappedWrite.hEvent, TIMEOUT_WRITECOMM_EVENT ) )
            dwBytesWritten = 0;
        else {
            GetOverlappedResult ( m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE );
            m_OverlappedWrite.Offset += dwBytesWritten;
        }
    }

    return ( TRUE );
}

// 向串口发送数据
int jeff_class::CMySerialPort::SendData ( const char *buffer, int size )
{
    if ( !m_bOpened || m_hIDComDev == NULL ) return ( 0 );

    DWORD dwBytesWritten = 0;
    int i;

    for ( i=0; i<size; i++ ) {
        WriteCommByte ( buffer[i] );
        dwBytesWritten++;
    }

    return ( ( int ) dwBytesWritten );
}

然后调用函数连续发数据的循环语句:

char send_continue_data[]= {'\x01','\x12','\xFD','\x13','\x00','\x00','\x00','\x00','\x12','\x00',data1,
    data2.....,data13};
    my_class.SendData(send_continue_data,sizeof (send_continue_data));
    Sleep(100);//需要sleep 一段时间..

低功耗模式唤醒后 需要晶振的切换稳定后才能可靠工作

谢谢您的及时回复,这种情况有什么好的解决方法吗?

你的程序实现哪些功能?

1、串口通讯数据时提前把省电模式关掉,发送完成以后再把省电模式关闭

2、把通讯间隔设置短一些,可以通过设置GATT参数来设置

3、希望可以帮助你,助你早日解决问题!同时分享一下你解决问题的方法,谢谢!

您好,功能不多,就是大数据的收发;电脑上存有一个数据文件,通过自己编写的C程序从USB dongle发送出去,发到我们自己的一块板子的RAM中;反方向,从dongle收进外面电路板RAM来的数据,保存到电脑本地即可

你好!感谢你的回复,现在我的dongle里烧的默认是TI 提供的 CC2540_USBdongle_HostTestRelease_All.hex 固件,没做任何改动,

我不是太清楚在哪里可以调节参数,是有一些范例工程吗?能否告知一下具体的细节?谢谢!~

1、dongle与你的板子要连接,两者是主从关系,dongle端的程序属于master,而你的板子应该是slave

2、dongle端的程序(HostTestRelease)这个例程的程序我还没有研究透,具体在哪里更改不太清楚

3、你板子端的程序属于slave,与SimpleBLEPeripheral这个例程类似,所以可以在这里面进行一下更改,可以先做以下测试:

      a、在工程属性(alt+F7)--> C/C++ Compiler -->Preprocessor --> Defined Symbols中在POWER_SAVING前面加一个x,即xPOWER_SAVING

      b、在主程序中把以下两个宏更改小一些:          

           // Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
           #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80

         // Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
          #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800

4、希望可以帮到你,祝你早日解决问题,并分享一下解决问题的方法,谢谢!

非常感谢您的回复!我去试试看。有什么结果马上回馈;

 这有一个例程,你可以参考一下:

http://processors.wiki.ti.com/index.php/CC2540_Data_Throughput

8304.Cc2540_throughput_10ms_20byte_notifications.zip

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top