1

从按照第 - GPS Intermediate Driver IssuesGPS中间驱动程序从虚拟串口驱动程序减慢数据

以上未成功回答觉得我有过这一问题的新信息,去一个新的问题。

我面临的问题是GPS中间驱动程序正在传递数据的速度。

我已经成功地使用Pocket Putty来读取串行端口并查看确切的信息被暴露。

COM 1 - GPS中间驱动

COM 6 - 串行端口到PC(输入数据手动地)

COM 8 - 虚拟串行端口,用于GPS硬件。

在阅读COM 8时,我会看到大约每18秒出现约18个NMEA字符串,这个速度与我们可以通过有限的USB连接一样快。它很快显示在屏幕上。当读取COM 6(手动发送来自PC的数据)时,其显示速度相同。所以这些数据没有问题。

输入GPS中间驱动程序。 GPS中间驱动程序设置为COM1(软件)和COM6(硬件)时。在COM1上输入的数据在COM1上显示的速度与没有GPS中间驱动程序时一样快。数据没有改变,所以如果我在COM6上发送“JON”,它将出现在COM1上,即使它的NMEA数据不是有效的,这很好。

问题在于COM8。 GPS中间驱动程序设置为COM1(软件)和COM8(硬件)时。在Pocket1上显示的数据在COM1上真的很慢。屏幕上的输出大约每秒5个字符,数据有效,但传输速度非常慢。这给我指出了在实现虚拟串行端口时的一个问题,就好像GPS中间驱动程序没有一次只读取一个字符的所有数据一样,因为我已经将问题隔离到了我的虚拟串行端口。

任何人都可以提供一个虚拟串口实现的明确例子,因为我不知道我可以改变什么来改善这一点,因为COM8直接与GPS软件和PocketPutty应用程序一起工作,这表明数据可用,正在读取,并且是正确的。

回答

0

从运行调试版本的设备制造商获得支持后,问题的原因是客户端应用程序正在进行多次读取调用。串口可以自己处理它们,但是通过GPS中间驱动程序,调用的数量太高,开销削弱了通信,这取决于互斥锁和一般线程问题。

客户端应用程序需要每次读取960个字节的数据到GPS中间驱动程序,以使它们正常工作。这不是一个理想的解决方案,所以找到了另一种修复方法

该解决方案是在read方法中添加一个WaitForSingleObject(IsThereEnoughGPSDATAEvent,COMTotalTimeout),以便所有读取操作只在有足够数量的可用数据时才会获取数据。最初我要求960在缓冲区中可用,但我已将其设置为仅10个字节,并且仍然可用。

示例代码

DWORD COM_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) 
{ 
    if(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE] != NULL) 
    { 
     if(WaitForSingleObject(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE], GPSTimeouts.ReadTotalTimeoutConstant) != WAIT_OBJECT_0) 
     { 
      return 0; 
     } 
    } 

    //read code goes in here 

    return dataOut; 
} 
相关问题