比如我理论上从一个指令的发送到接受是10毫秒,但是真的是10毫秒吗?、?,如果WIndows多任务处理机制这个串口通信的传输到底影响多大?欢迎详细解答

解决方案 »

  1.   

    采用串口通讯只能用单任务 就这样还需要CPU等待呢。你再用多任务 这个也跟你机器支持的波特率有关系。
      

  2.   

    windows是一个多任务系统,通过多个任务切换来分段使用CPU,比如这个任务分配几个CPU周期,完成后又会给另外一个任务分配一个CPU周期,程序的切换是通过对程序的优先权动态设置完成的,所以在任务比较多的时候不能保证10ms完成一次数据传输,可能提高你串口通讯函数的优先级来提高程序运行的速度.
      

  3.   

    比如我采用的是MEWCOL协议,波特率最大是115200,而采用PROFBUS总线协议最快速度是12M每秒,在这样的情况,比如我在波特率为115200的情况下,从指令发送到接收到是10毫秒,那如果在12M的情况,应该是更小,WINDOWS的多任务处理这样的影响还大?那我怎么样才能使CPU单任务呢?求教啊,很着急的问题,或者我应该怎么样才能实现高速采集的问题,我现在采用的协议时MEWCOL协议,波特率最大也就是115200,,以前用过串口调试软件,发现最快也要30多毫秒呢,根本就达不到理论上的10毫秒,而且这个速度也根本不稳定
      

  4.   

    我现在采用的是MSCOMM控件来编写通信的,上位机是用VB编的
      

  5.   

    单任务不可能,windows本身还有许多系统服务要跑,只能是少开其他的程序
    就算是单任务的系统,每种通讯方式的传输速度也有上限吧
      

  6.   

    那我该怎么样提高这个速度呢,或者不采用这样方法,我现在采用时RS232的协议本质上,我发现很多板卡数据采集时采用PCI总线或者USB总线协议,这样速度就快很多了,我给你看一个板卡的说明哦,你看看
    在虚拟仪器、实验室数据分析、医疗设备、记录仪等诸多研究和应用领域中,对数据的要求很高,一方面数据容量较大,如几百兆甚至几仟兆,另一方面采样速度都较高,如100KHz、200KHz、300KHz等,更重要是要求在高速长时间的采集数据过程中,不能丢掉一个点,必须全部存入硬盘,同时还要进行一些点的抽样分析,这在DOS环境中实现起来就有较大的难度,就更别说在Windows这样的多任务环境中(对于Windows多任务机制请参阅有关Windows手册)。大家知道Windows的各应用程序总是不断地被任务调度器调度,循环处在睡眠、排队、就绪、触发运行等状态中。Win95任务之间的切换密度至少大于1毫秒,那么如果要以100KHz频率采样(即每10微秒就得传输一个数据),很显然有大量的数据在传输中由于任务之间的切换而被丢失掉。这就是基于Windows客户程序在传统模式下,高速连续采集传输数据时所具有的局限性。为了突破这种局限性,就得采用别的办法,如非客户程序、内核程序、驱动程序(如VxD、微代码)等,再加上我们所掌握的新技术,如内存映射、直接写盘技术以及独有的设计思想便可以很好的解决这些问题。我现在也不知道我怎么样做到高速采集,用普通的方式,老丢失数据啊
      

  7.   

    板卡的高速采集一般有在板的缓存,然后通过DMA方式传入到内存。windows下的串口通信,不用驱动的话,CreateFile打开串口,用异步方式比同步方式好很多,你可以试验一下。
      

  8.   

    恩,楼上说的非常有道理,板卡是这样做的,我现在用串口控件MSCOMM和CreateFile有什么区别吗?因为接收端得设备的波特率只有115200,我的理想速度就是做到从发送到接收只需要15毫秒?本身都是用的异步通信
      

  9.   

    估计MSCOMM内部也是用CreateFile、ReadFile、WriteFile之类的APIs操作串口,是否异步方式不清楚。Windows的文件操作异步方式(Overlapped)和232的异步通讯不是一个概念,后者是指发送方和接收方的波特率可以不同。
      

  10.   

    恩,现在项目的需求是需要在1.5毫秒内,通信能完成一个发送和接收,DelphiGuy,你觉得有可能实现不?
      

  11.   

    那个时间应该只是硬件上的吧,还有软件上的时间,Windows的多任务处理对其没有影响吗?请教了
      

  12.   

    <我接收的数据有59个字符,一个字符如果数据位是7位,起始位没有,一个停止位,一个奇偶位,波特率为115200,算起来是8位,59*9/115200*1000=4.6毫秒,这样算的话,就已经达不到了,怎么还能达到呢?发送的字符大概是17*9/115200*1000=1.3毫秒,发送的整个硬件上的时间就已经为(1.3+4.6)了,怎么能做到在8K的波特率的情况下,做得到呢?上面的方法是一次性读取十个数据,如果一次只读一个数据的话,差不多整个过程就2.6毫秒吧 >硬件波特率和你的程序无关,硬件有硬件缓冲区。如果你需要持续高速传输,请不要用串口通信。
      

  13.   

    #21、#22,是硬件上花费的时间。
    不过你说的59个字符,那是你的程序每次接收的数据量,是一个“逻辑量”。
    而串行通讯是一位一位传输的,8K波特率的话每秒大约传输800~900字节,全双工完全可以满足你的需要。软件上处理发送、接收肯定也要时间,windows多任务肯定也有影响(使你的程序周期性失去控制)。
    如果你的传输数据量不大的话,应该降低波特率的设置,没必要115200,波特率设得越高,多任务切换多通讯的影响就越大。
      

  14.   

    DelphiGuy我还是不怎么明白,难道我传送的这个59个字符的速度跟波特率没关系吗?不怎么懂,请教了?串口通信的时间分为哪几部分呢?我的硬件现在只支持半双工通信啊,怎么办?
      

  15.   


    当然有关系了。
    你的串行通讯是否在115.2K下持续传输数据?
    如果数据量并没有这么大,可能的话,把波特率设置降低,比如平均1秒只传输几百字节的数据,那么设置为8K或者16K波特率就可以了,这样中断处理上的时间就降下来了。
    半双工也没关系,只是有效传输率降低了一半而已,一方发数据的时候另一方只能收。
      

  16.   

    其实我的数据量不大,大概发送读取也就是20多个字符,我要求的是速度啊,1.5毫秒进行一次完整数据发送和接收。如果说用波特率提高不了速度,那用什么提高速度呢?你说波特率跟这个速度没什么关系,我不怎么明白该在哪边提高速度,当软件进行采集数据时候,其他的动作都不进行。
    谢谢DelphiGuy兄这么热心的回复啊,呵呵
      

  17.   

    “1.5毫秒要完成发18字符,收23个”这个速度,115200半双工都做不到,就别浪费时间了,改USB吧。
      

  18.   

    请问一下楼主的开发工具是什么的,delphi吗?
      

  19.   

    我现在上位机是用VB来开发的,我现在发送数据的方法是就是采用一收到正确的应答响应来发送数据的,唉,我也觉得只能采用USB,现在的协议是采用MewCol协议,你说如果采用ProFBuS协议能满足要求吗?它的最快速度是12M/S,可以吗?如果用USB来做感觉不怎么可能,因为硬件不支持USB总线协议
      

  20.   

    按照你的说明,“数据位是7位,起始位没有,一个停止位,一个奇偶位”,“1.5毫秒要完成发18字符,收23个”,这个速度要求的波特率至少是(以半双工计算):
    1000/1.5*(18+23)*(7+1+1)=246000显然115200波特率半双工是满足不了的(就是全双工也满足不了)。
    尽管16550支持230k和460k波特率,但这是“非标准”的,不是在所有主板上都支持(跟时钟有关),而且也不能保证所有的串行通讯设备用的都是16550uart兼容的芯片。12M/S的速度,当然是没问题的了,但是你又说“硬件不支持USB总线协议”,那怎么办呢?485支持吗?红外?
      

  21.   

    抱歉,没注意你说的12M/S是PROFIBUS的速度,还以为是USB呢。
    既然你的设备支持PROFIBUS总线协议,那应该可以用RS-485通讯,不过PC上一般没有485支持,需要另配板卡,驱动也就有了。:)