【发布时间】:2019-08-09 22:36:22
【问题描述】:
我正在尝试从我的 gps 接收器读取整个消息流,我需要在一个消息块和下一个消息块之间对流结束进行某种识别。
我尝试读取具有各种尺寸(100、200、500、1000)的缓冲区,显然如果太短我会中断消息,如果太长我会发现重复相同的消息块,例如:
GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC这就是我希望在接收时接收到的每个中断(例如,使用 HAL_UART_ReveiveIT(),但在其他平台上,这个概念也是相同的)。
相反,关于我提供的缓冲区大小,我有如下数据:
GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXX或
GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXX或
GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXX我无法检测到消息块的结尾,它会再次重复,例如:
GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC GNGGA,XXXXXXXXX*CC GNGNS,XXXXXXXX*CC GNRMC,XXXXXXXXXXX*CC GNGSV,XXXXXXXXXX*CC我尝试检测接收到的字符的中断,因此检查当前字符是“\r”还是“\n”,但是这适用于每一行,它只检测一行的结尾,而不是块的结尾。
我想从 uart 读取,在完成接收时中断或在 DMA 上中断,只有完整的消息块,然后再读取下一个块,但是 我找不到任何标志或终止字符这可以帮助我区分块。
另外,根据每条消息的数据,块可以有不同的大小,所以我不能给出一个固定长度的数组。
我在考虑硬件流控制或者使用来自gps的fix LED信号来发送一个可以触发块结束的外部中断...
- 你有什么想法吗?
- 这完全是使用解析器进行后处理的问题吗?
- 可能会丢弃或覆盖多个同类句子中的字段?
感谢您的帮助
【问题讨论】:
-
“这都是使用解析器进行后处理的问题吗?” -- 正确,否则您在中断级别和 UART 驱动程序上尝试做太多事情。 UART 没有行或块的概念,只有单个字符的帧。帧之间存在中断条件和计时暂停(例如 Modbus),但这些完全在发送方的控制下发生。
-
感谢锯末,我希望在中断方面可以做更多的事情,但显然情况并非如此。干杯
-
是这个协议吗:navspark.mybigcommerce.com/content/NMEA_Format_v0.1.pdf?如果是这样,您真的应该只是在每条消息的末尾通过 CR+LF 解析消息。这将比通过其他方式(例如使用 IDLE 中断)将数据拆分为消息更加健壮。
标签: gps buffer line stm32 uart