最近使用stmf103做一个信号采集的实验板,觉得用usb传数据比较方便(主要是笔记本上都不带串口啊)。比较后打算用usb的虚拟串口功能比较好。有主机端的驱动程序,又有设备端的例程。
但是用起来有很多问题。因为是实时采集,所以缓冲区(buff_in)满后就传输,发现用串口调试助手接收的数据最初很快,几秒钟后就变得有停顿,速度明显变慢。起初怀疑dma或da处有问题。
所以定义一个640字节的数组,初始化后连续传输,发现也有同样问题。速度变慢,同时分包连续传输(比如32字节或64字节)时,会有丢包的现象,而且比较规律,就是包是完整,但是中间会丢掉几个包。接收时cpu占用率为100%。郁闷啊,不知道什么原因。主机还是设备?
我的程序主要是基于万利提供的虚拟串口例程,驱动程序是st网站上提供的(6月份上传的版本比较新啊)。设备程序主要常识了两个办法。一个是在EP1_IN_callback函数中填入以下程序。
UsertoPMABufferCopy(&buff_in(i*32),ENP1_TXADDR,32);
SetEP1TxCount(ENP1,32);
setEPTxStatus(ENP1,EP_TX_VALID);
其中i是累加的,循环传输640个字节,这个程序出现上述问题后又常识了在主程序里修改,并去掉对EP1_IN_callback的修改,程序如下:
if(GetEPTxStatus(ENP1)==EP_TX_NAK)
{
UsertoPMABufferCopy(&buff_in(i*32),ENP1_TXADDR,32);
SetEP1TxCount(ENP1,32);
setEPTxStatus(ENP1,EP_TX_VALID);
}
问题依然,到底是为什么啊?还需要其他的什么设置吗?或者是驱动程序和串口调试助手不兼容,接受有问题?请各位高手指点
虚拟串口的程序我运行到某一段就跑不下去了,怎么回事啊
能否帮我看下,是怎么回事啊?
运行到 void Virtual_Com_Port_init(void)
中的 while (pInformation->Current_Configuration == 0) NOP_Process();
就运行不下去了
如图
对数据包,我觉得是缓冲的问题。
楼主把代码打个包传上来吧。
在if(GetEPTxStatus(ENP1)==EP_TX_NAK)前加一个时间限制,让他每发完一个包休息一下,具体时间你可以调整;这样速度可能没你原来的那么快,可是如果你让他休息的时间调整的好的话绝对不会有漏包现象和停止的现象,我试过的,这是接收软件的瓶颈问题,我现在正在找另一个标志来替代if(GetEPTxStatus(ENP1)==EP_TX_NAK)解决这个问题。