tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1227回复:10

『求助』D12在数据采集中的问题

楼主#
更多 发布于:2004-03-21 16:37
我的问题是现在是要求从单片机中每隔5ms读一次数据
   在单片机中通过定时器每隔5ms向其ram中写32个数,(虽然D12
主端点有64B,但为了调试只写了32个),上位机用线程读数据。我现在发现读上来的数据有丢掉的。而且丢掉的刚好都是32B大小的数
   这是不是意味着上面线程中读的速度太慢了呢????
1)我用zlg提供的demo程序,测得的传输速率是32KBit/s,将buffer设为64B时,速度变为64Bit/s,很奇怪,不知是否是巧合。但是不是可以判断问题不是出在D12上面,因为按照测得的数据传输速度,应该是可以满足的。
2)传输我用的是中断方式,根据协议,中断方式中USB主机每隔一段时间就会向USB设备发送数据传输要求,(时间间隔在描述符中设定,ms级),那这样是否可以用这个定时呢,下位机在中断服务程序中只需要将数据写到D12的发送缓冲区中去呢??
   恳请大侠们指点一二!
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-03-22 08:28
中断最大的缓冲是16BIT
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-22 09:55
对于全速设备,中断传输的数据包上限为64,BYTEs,低速设备为8 BYTEs.
你用的是D12,包的大小是可以的。但你必须在协议中指明包的大小。对于你的情况,包大小应该是32或64。

中断传输不适合做成等时传输使用。
如果你的单片机能够保证每隔5毫秒送出一次数据,那么你的中断间隔必须小于5毫秒,可以使用2或3毫秒。并且数据中最好带上时标。否则,应该是要丢数据的。因为它所谓的中断不过就是毫秒级的查询采样。你应该有这方面的知识:采样速度要远高于被采样信源的速度才能保证采样不丢。

1)你的数值写错了吧?应该是32kBYTEs/S和64kBYTEs/S吧?这不是巧合,就应该是这样。

不可以用于定时,除非你对于时间的要求非常宽松。因为它的时间误差是相当大的。
A strong man can save himself. A great man can save another.
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-22 09:56
对了,如果能够大致描述你的应用,可能更有助于解决问题。
A strong man can save himself. A great man can save another.
tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-22 10:42
1)的确,以前输入的bit全部应该是Byte
2)我在主端点2的描述符中间断查询的时间间隔设置的是1ms(最高精度了),而下面用单片机定时到5ms,我曾经把下面的定时到20ms,40ms并没有看到送上来波形有良好的改善,数据还是有丢的


我现在的要求仅仅是在单片机中每隔5ms发送的数据要送到pc上,还没有考虑mcu的前向通道采样。
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-22 10:50
那么你在单片机与D12之间使用的是查询还是中断呢?
会不会是由于数据重叠了呢?
A strong man can save himself. A great man can save another.
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-22 10:51
你的水平可不只新手上路这么简单!
呵呵!:)
A strong man can save himself. A great man can save another.
tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-22 11:01
中断啦,D12的中断接了mcu的int0。我的判断就是数据重叠,上面可能还没有读走,单片机定时中断就将其覆盖了!
有什么办法解决呢??


zmwk夸奖了!呵呵!
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-22 12:38
作一个FIFO(最好使用片内RAM),5ms时钟中断到来时,数据压入FIFO;USB的IN包中断到来时从FIFO取数据。

学过数据结构的人都会写FIFO的。只要实现4个函数:
BOOL PushInFifo(SFifoStruct * pFifo, SItem * pItem);
BOOL PopFromFifo(SFifoStruct * pFifo, SItem * pItem);
BOOL IsFifoEmpty(SFifoStruct * pFifo);
BOOL ISFifoFull(SFifoStruct * pFifo);

有了FIFO之后,就可以实现数据流量匹配了!
:)
A strong man can save himself. A great man can save another.
tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-23 11:34
D12的发送和接受缓冲区本身就是一个fifo
难道我还有必要在mcu上再开个fifo吗???
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-03-23 12:23
我以前举过一个例子:就是CD随身听的防震功能。
CD机为了保证音乐的连贯性(相当于数据不丢),通常会做10秒到40秒的防震缓存,相当于FIFO。FIFO越大防震效果越好。

对于你的系统,如果CPU要做很多事情,就要求底层尽量提供足够大的FIFO,保证处理负荷匹配。PC的CPU处理能力够快了吧?它的串口还有16字节的硬FIFO呢!
A strong man can save himself. A great man can save another.
游客

返回顶部