This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C1294NCPDT:UART 发送到 GPS 传感器时出现问题

Guru**** 1799800 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/576429/ccs-tm4c1294ncpdt-problem-with-uart-transmitting-to-gps-sensor

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我正在尝试将 UART0接口与 tm4c129 launchpad 配合使用、以连接来自 SparkFun 的 venus GPS 传感器。 我可以每次接收数据、但我无法发送命令来限制每次实际获取的数据。 下面是我编写的用于接收的 UART 代码。 当我也从这个中断过程中接收数据时、我也会得到一个溢出错误。 如果有任何建议或帮助、我们将不胜感激!

www.sparkfun.com/.../Skytraq-Venus634FLPx_DS_v051.pdf 这是数据表、这是传感器 www.sparkfun.com/.../AN0003_v1.4.14_FlashOnly.pdf 的二进制命令

下面是我到目前为止的代码。


#include
#include
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"

uint32_t ui32SysClkFreq;
int y;
char *token;
char c ='0';
字符数据[80];
INT 计数= 0;
无符号字符速率[17]={0xA0、0xA1、0x00、0x09、0x02、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x08、0x0D、0x0A};
无符号字符 GGA[16]={0xA0、0xA1、0x00、0x09、0x08、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x08、0x0D、0xA0};
uint32_t num = 120000;
uint32_t delay = 102888;
void sendChar();

int main (空)

   ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
   SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
   while (!SysCtlPeripheralReady (SYSCTL_Periph_UART0))
   UARTClockSourceSet (UART0_BASE、UART_CLOCK_SYSTEM);
   GPIOPinConfigure (GPIO_PA0_U0RX);
   GPIOPinConfigure (GPIO_PA1_U0TX);
   GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
   UARTFIFODisable (UART0_BASE);
   UARTTxIntModeSet (UART0_BASE、UART_TXINT_MODE_FIFO);
   UARTConfigSetExpClk (UART0_BASE、ui32SysClkFreq、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
   UARTFIFOEnable (UART0_BASE);
   UARTTxIntModeSet (UART0_BASE、UART_TXINT_MODE_FIFO);
   UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);

   IntMasterEnable();
   IntEnable (INT_UART0);
   UARTRxErrorClear (UART0_BASE);
   UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_OE | UART_INT_RT);


/*void sendChar()

   unsigned int y;
   对于(x=0;x<10;x++)
   {
   while (UARTBusy (UART0_BASE));
   UARTCharPut (UART0_BASE、RATE [x]);
   SysCtlDelay (100);
   X++;
   *



空 UARTIntHandler (空)

   uint32_t ui32Status;
   ui32Status = UARTIntStatus (UART0_BASE、TRUE);//获取中断状态
   UARTIntClear (UART0_BASE、ui32Status);//清除已发出的中断
   while (UARTCharsAvail (UART0_BASE))//循环(有字符时)
   {
      for (y=0;y<16;y++)
         {
         while (UARTBusy (UART0_BASE));
         UARTCharPut (UART0_BASE、GGA[15]);
            Y++;
         }

         if (计数<80)
               {

               //SysCtlDelay (延迟);
               DATA[COUNT]= UARTCharGet (UART0_BASE);
               //SysCtlDelay (延迟);
               count++;

               }
         if (count = 80)
         {
            UARTDisable (UART0_BASE);

         }


   }


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    John、
    首先、请在发布代码时使用 RTF 格式界面( 图标)。 很难将您发布的代码可视化。
    至于您遇到的困难(可能令人困惑的可视化在这里没有帮助)、您是否真的在每次中断发生时通过 Uart0发送命令? 这意味着、对于传入的每个字节、您会向外发送16个字节? 配置命令通常仅发送一次到外部器件。
    为什么在收入缓冲区已满时关闭 UART? 即使您每秒收到一条 GPS 消息、您也希望在一秒后处理下一个位置。 您需要解析消息、处理这些值并继续。
    谢谢
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如 Bruno 指出的、您不希望在每次接收字符时传输值0xA0的16倍。 如果该传输的目的是配置 NMEA 信息以禁用除 GGA 之外的所有标准消息、则应从 main 调用该循环、而不是在中断例程中调用、并且在传输时需要通过数组进行索引。 最后、校验和字节应为0x09而不是0x08 (0x08 ^ 0x01)、该字符串的最后一个字符应为0x0A、而不是0xA0

    接收溢出的第二个原因是、您永远不会将计数重置为零。 当我执行 NMEA0183应用时、在 UART 中断处理程序中、我将检查接收到的 LF (0x0A)字符、并将其标识为字符串的末尾。 然后、我将设置一个将在主例程中检查的标志、而主例程将处理 NMEA 字符串。 我使用循环缓冲器来接收字符串、但更简单的实现方式是分配两个80个字符串并在它们之间交替。 让中断处理程序填充一个、同时主例程处理在另一个中接收到的句子。