关注 - GPS Intermediate Driver Issues
以上内容未得到成功解答,我觉得我有关于该问题的新信息可以提出新问题。
我面临的问题是GPS中间驱动程序提供数据的速度。
我已成功使用Pocket Putty读取串口并查看已公开的确切信息。
COM 1 - GPS中间驱动程序
COM 6 - 串口到PC(手动输入数据)
COM 8 - GPS硬件的虚拟串行端口。
当读取COM 8时,我可以看到每隔约3秒钟出现大约18个NMEA字符串,这与我们可以通过有限的USB连接推送它一样快。它会在显示屏上快速显示。读取COM 6(手动从PC发送数据)时,它显示速度相同。所以数据没有问题。
输入GPS中级驱动程序。当GPS中间驱动程序设置为COM1(软件)和COM6(硬件)时。 COM6上输入的数据与没有GPS中间驱动程序的情况一样快地显示在COM1上。数据没有改变,所以如果我在COM6上发送“JON”,它将出现在COM1上,即使它没有有效的NMEA数据,这很好。
问题出在COM8上。当GPS中间驱动程序设置为COM1(软件)和COM8(硬件)时。在COM1上的PocketPutty中显示的数据非常慢。屏幕上的输出大约是每秒5个字符,数据有效但输送速度非常慢。这对我来说指出了虚拟串口实现中的一个问题,好像GPS中间驱动程序一次只能读取一个字符的所有数据,因为我已将问题隔离到我的虚拟串口。
任何人都可以提供虚拟串口实现的明确示例,因为我不知道我可以改变什么来改善这一点,因为COM8直接与GPS软件和PocketPutty应用程序配合使用,这表明数据可用,正在读取,并且是正确的。
答案 0 :(得分:0)
在获得运行调试版本的设备制造商的支持后,问题的原因是客户端应用程序正在进行许多读取调用。串口可以自己处理它们,但是通过GPS中间驱动程序,调用次数太多而且开销严重阻碍了通信,这取决于Mutex锁和一般线程问题。
客户端应用程序需要读取每次读取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;
}