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 一段时间..
da qin zheng sheng:
低功耗模式唤醒后
需要晶振的切换稳定后才能可靠工作
YiFeng Yang:
回复 da qin zheng sheng:
谢谢您的及时回复,这种情况有什么好的解决方法吗?
da qin zheng sheng:
回复 YiFeng Yang:
你的程序实现哪些功能?
mark_xu:
1、串口通讯数据时提前把省电模式关掉,发送完成以后再把省电模式关闭
2、把通讯间隔设置短一些,可以通过设置GATT参数来设置
3、希望可以帮助你,助你早日解决问题!同时分享一下你解决问题的方法,谢谢!
YiFeng Yang:
回复 da qin zheng sheng:
您好,功能不多,就是大数据的收发;电脑上存有一个数据文件,通过自己编写的C程序从USB dongle发送出去,发到我们自己的一块板子的RAM中;反方向,从dongle收进外面电路板RAM来的数据,保存到电脑本地即可
YiFeng Yang:
回复 mark_xu:
你好!感谢你的回复,现在我的dongle里烧的默认是TI 提供的 CC2540_USBdongle_HostTestRelease_All.hex 固件,没做任何改动,
我不是太清楚在哪里可以调节参数,是有一些范例工程吗?能否告知一下具体的细节?谢谢!~
mark_xu:
回复 YiFeng Yang:
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、希望可以帮到你,祝你早日解决问题,并分享一下解决问题的方法,谢谢!
YiFeng Yang:
回复 mark_xu:
非常感谢您的回复!我去试试看。有什么结果马上回馈;
mark_xu:
回复 YiFeng Yang:
这有一个例程,你可以参考一下:
http://processors.wiki.ti.com/index.php/CC2540_Data_Throughput