如何在一秒内读到10000个数据并且传给另外一个进程?

HN_gsf 2014-12-24 03:00:33
是这样的,我想利用mscomm控件实现在一秒内从串口出读到10000个数据并且把它存储到数据库中去,
但是好像在一个进程中读取数据并且在读到的同时进行存储到acces数据库 好像老是出错,(在一秒传输30个的时候不会出错,但是一秒传输100个的时候就会出错了)是不是就是这样的想法本身就是错误的?
所以我想利用一个进程不停的读取外部数据,另外一个进程不停的从这个进程的内存中读取数据,那么我利用匿名管道,剪贴板,或者共享内存方式或者映射文件方式能不能实现,或者说我应该采取什么更加合理的方法?
好纠结,希望大神可以在采集数据和存储数据或者说进程通信方面给一些建议
...全文
487 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我最近也在做这个,串口接收的转速。还有其他的温度压力等待测量,我看过一份技术文档,是研华的DMA高速数据采集,用的fifo,很符合你的要求。采集和存储互不干扰。
worldy 2014-12-31
  • 打赏
  • 举报
回复
lz的问题瓶颈在于串口通信,10K字节+校验位开始位结束位的有11位每字节,则起码的有110K的波特率,传输可能会失败,得有错误处理机制,建议使用usb传输
worldy 2014-12-31
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
如果 波特率 9600 ,数据 1 字节 长 , 那么 1 秒 1000 ( 1ms 一个)。
加上起始位结束位校验位,一个字节不止1ms,如果还要校验应答,则远远多于1ms
笨笨仔 2014-12-31
  • 打赏
  • 举报
回复
你可能使用的不是MFC,但可以使用API函数。建议自己搜索一下 自定义消息,Windows系统使用的就是消息循环机制。
HN_gsf 2014-12-31
  • 打赏
  • 举报
回复
引用 24 楼 wxhxj0268 的回复:
[quote=引用 20 楼 HN_gsf 的回复:] 假如我使用两个线程来完成接受和存储,有没有人可以告诉我怎么才能使得接受数据和存储数据互不干扰,使用setevent可以不?我觉得接收数据的那个线程应该是优先级高一点吧,要不然在存储的时候数据来了,不是会丢失数据么?
接收线程收到数据后,按数据大小申请一块内存,保存一下,用消息将内存指针发给处理线程,处理完成后释放该内存。由于消息由一个队列由系统管理,所以不会丢失。[/quote] 您好,非常感谢你的回答,您所说的申请一块内存保存数据,是指保存一个数据吧?然后把地址发给存储线程,您所指的消息是什么?在双线程中我暂时只是知道互斥量。这是不是就是所谓的接收一个数据处理线程处理一个数据?希望可以说的明白一点,另外如果是缓冲区的概念的话你这个怎么就能保证在处理线程运行的时候 使得接收数据的线程正常工作?是不是优先级的问题?只要过来数据的时候就可以接收?谢谢
笨笨仔 2014-12-31
  • 打赏
  • 举报
回复
引用 20 楼 HN_gsf 的回复:
假如我使用两个线程来完成接受和存储,有没有人可以告诉我怎么才能使得接受数据和存储数据互不干扰,使用setevent可以不?我觉得接收数据的那个线程应该是优先级高一点吧,要不然在存储的时候数据来了,不是会丢失数据么?
接收线程收到数据后,按数据大小申请一块内存,保存一下,用消息将内存指针发给处理线程,处理完成后释放该内存。由于消息由一个队列由系统管理,所以不会丢失。
HN_gsf 2014-12-31
  • 打赏
  • 举报
回复
引用 22 楼 draculamx 的回复:
把从串口接收到的数据,放入一个“缓冲区”中,比如,你的一个数据代表一个字节,那么,你可以建立一个缓冲区 char [100][1000];, 这样,你就有了一个队列,它可以存放100次接收到的数据,然后你可以把队列中的数据,放到数据库中就可以了,但是你需要自己来管理这个队列,如果你不想自己管理,你可以使用STL中的'queue“容器,这是最简单的方法
现在的情况是我最想知道怎么才能使用两个线程使得互不干扰,在读取数据的同时可以存储数据
draculamx 2014-12-30
  • 打赏
  • 举报
回复
把从串口接收到的数据,放入一个“缓冲区”中,比如,你的一个数据代表一个字节,那么,你可以建立一个缓冲区 char [100][1000];, 这样,你就有了一个队列,它可以存放100次接收到的数据,然后你可以把队列中的数据,放到数据库中就可以了,但是你需要自己来管理这个队列,如果你不想自己管理,你可以使用STL中的'queue“容器,这是最简单的方法
HN_gsf 2014-12-30
  • 打赏
  • 举报
回复
自己顶一下,希望有人来一个明白的回答
HN_gsf 2014-12-30
  • 打赏
  • 举报
回复
假如我使用两个线程来完成接受和存储,有没有人可以告诉我怎么才能使得接受数据和存储数据互不干扰,使用setevent可以不?我觉得接收数据的那个线程应该是优先级高一点吧,要不然在存储的时候数据来了,不是会丢失数据么?
sumos 2014-12-26
  • 打赏
  • 举报
回复
sqlite本地数据库,写入50万个数据(每个数据10字节),大约需要3s。
zgl7903 2014-12-26
  • 打赏
  • 举报
回复
问题分成两部分, 1解1秒如何读到10K高数据 2解决存储
likfeng 2014-12-26
  • 打赏
  • 举报
回复
串口接收不推荐用mscomm控件
直接api操作串口
likfeng 2014-12-26
  • 打赏
  • 举报
回复
acces不适合大数据量存储 换数据库mysql或mssql
HN_gsf 2014-12-26
  • 打赏
  • 举报
回复
自己顶一下,才接触mfc三个月,真的是有好多不懂得,但是不知道该怎么努力 ,等待各位的指点
HN_gsf 2014-12-26
  • 打赏
  • 举报
回复
看了别的提问,有人提到说acces在70000条记录以上的时候会出现变慢的情况,我想存储的数据量绝对不是几万条的啊,这种情况是真的么?怎么解决?
HN_gsf 2014-12-26
  • 打赏
  • 举报
回复
引用 9 楼 lis2012 的回复:
最好使用多线程来操作,比如说数据量达到20000个或者更多的时候再存储,使用队列保证数据接受存储两不误
您好,能不能说的详细一点?
sichuanwww 2014-12-26
  • 打赏
  • 举报
回复
网口吧 理论是1000M 千兆以太网都有了哈
HN_gsf 2014-12-25
  • 打赏
  • 举报
回复
谢谢你们的回答,让我明白了好多,谢谢~
笨笨仔 2014-12-25
  • 打赏
  • 举报
回复
理论上貌似115200可以满足你的要求,但实际上是不行的。如果要高速传送数据,最可靠的方式是使用以太网。
加载更多回复(9)

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧