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.

[参考译文] TM4C1292NCPDT:UART 传输问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1137077/tm4c1292ncpdt-problems-with-uart-transmission

器件型号:TM4C1292NCPDT
您好!

通过 UART0发送数据时、微控制器的 UART 传输存在问题 
在白蚁端子中观察它时、一些数据串会被切成一半(图像1) 、或者字符串中有空格(图像2)、您能给我任何建议来解决这个问题吗? :) 梅拉

Image 1
图1.


image 2
图2.

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

    Mayra、您好!

    您是否检查了 UART 配置是否与终端窗口的配置相匹配?

    您还可以尝试其他终端软件、如 TeraTerm 吗? 虽然我认为在这种情况下、它并不是很相关、但我以前曾遇到过术语显示的一些问题。

    此致、

    Ralph Jacobi

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

    您好!

    我已经检查了术语配置、它们看起来很好、 
    我还尝试了 TeraTerm、数据看起来也很混乱。
    梅拉 


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

    您好、Mayra、

    您能否发送您正在使用的代码以便我可以在我的板上运行它? 如果我可以这样调试它、这对我来说将是最简单的。

    https://e2e.ti.com/support/site-support-group/site-support/f/site-support-forum/812271/faq-how-do-i-add-a-code-snippet-to-my-post

    此致、

    Ralph Jacobi

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdint.h>
    #include <stdbool.h>
    #include <string.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_gpio.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/gpio.h"
    #include "driverlib/adc.h"
    #include "driverlib/debug.h"
    #include <driverlib/uart.h>
    #include <driverlib/interrupt.h>
    #include "inc/hw_ints.h" //librería para interrupciones
    #include <stdbool.h>
    #define NORM_MSG_LEN 26
    #define ERR_MSG_LEN 8
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    你好!

    这是我的代码!

    梅拉

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

    Mayra、您好!

    谢谢、我希望能够轻松地运行代码并进行复制、但我不确定这在这里会很简单。 如果我正在正确读取代码、您有时会收到指示 UART 输出的 UART 消息?

    如果是、我将无法完全复制您的系统设置。

    尽管知道这一点之后会带来一个不同的问题、即您看到的错误输出区域是否与通过 UART 接收的内容、与热敏电阻读数相关的内容或与器件中存储的静态消息相关的内容?  

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    
    是的、使用 UART1的微控制器向外部器件(S_P1)发送响应请求、 
    该器件是一个压力控制器、需要500毫秒的时间进行响应、因此是微控制器
    等待500毫秒,并调用函数 Guarda_arreglo()来处理从接收到的数据
    外部器件。 然后它发送另一个响应请求(S_P2),等待500毫秒并调用 Guarda_arreglo()
    这是因为它从两个不同的传感器请求压力。 来自两个压力传感器的数据是
    由 UART0作为以字母"P"开头的字符串发送。 有一个温度传感器(热敏电阻)、其值由微控制器通过 ADC 接收、
    总共有12个热敏电阻、但目前我只使用1进行测试。 处理的温度数据
    通过 UART0以字母"T"开头的数据串发送程序、 压力和温度数据串从 UART0发出、以在 LabVIEW 接口中显示数据。 我希望我已经正确地解释了自己、 此致、 Mayra
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mayra、您好!

    是的、这基本上是合理的-足以让我对应用有足够的了解。

    因此、查看源代码并了解其基于测量结果等、我认为现在发生的情况是、由于您只是通过 UART 发送原始字符、 有时、数据最终会成为一个字符、终端会显示为空格或 换行符 、而不是输出十六进制值。

    我想、如果您使用 UARTprintf 这样的函数 来指定希望如何输出字符串、则可以避免这种问题的发生。

    您可以做的一件事是检查一下、运行一个计数器、该计数器发送多少次类似'0x20'(Space)的数据、然后查看您是否运行它并看到4条带空格的消息、计数器读取4次... 这将解释您看到的输出、然后您可以尝试并解决该问题?

    这是我在这一点上的主要猜测、因为代码似乎使用正确的初始化编写得很好、我认为没有任何缓冲区溢出或数据损坏问题。 我认为这只是原始字符打印的一个例子、它导致终端获取一些数据、而不是将其输出为原始十六进制值、而是将其解释为其他值。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好!
    
    请问您能再多解释一下这些建议吗? 

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

    Mayra、您好!

    实际上、我认为发生的情况是、您收到的数据值有时为0x20。

    当您将0x20发送到带有 UARTCharPut 的 Termite 时、它只打印一个空格、而不显示数据值。

    因此、我建议检查您是否以数据的形式发送0x20、例如在发送数据之前查看数据、并使计数器递增、即数据值等于0x20。 如果是、这将解释问题。

    然后、您可以使用  UARTprintf 解决该问题。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好!
    
    我尝试使用 UARTprintf(),但它不会向终端发送任何内容, 
    程序和函数中都可以识别这些库、但测试短语不会出现在终端中。

    梅拉



    很抱歉,如果我有很多疑问,我没有太多编程经验:( 
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mayra、

    您需要以不同的方式初始化 UART、然后才能使用该调用。  需要调用 UARTStdioConfig 以使 UART stdio 函数知道要使用哪个 UART。 请参阅以下代码片段。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void prvConfigureUART(void)
    {
    /* Enable GPIO port A which is used for UART0 pins.
    * TODO: change this to whichever GPIO port you are using. */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    /* Configure the pin muxing for UART0 functions on port A0 and A1.
    * This step is not necessary if your part does not support pin muxing.
    * TODO: change this to select the port/pin you are using. */
    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);
    /* Enable UART0 so that we can configure the clock. */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    /* Use the internal 16MHz oscillator as the UART clock source. */
    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
    /* Select the alternate (UART) function for these pins.
    * TODO: change this to select the port/pin you are using. */
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好!
    感谢您的代码片段。 我尝试了 UARTprintf()函数,但字符串仍然被切断:() 

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

    Mayra、您好!

     您能否在应用中使用 UARTprintf 函数时发布该函数?  

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    
    我在 CONFIG_UART()中添加了 UARTStdioConfig()函数 
    用于配置 UART 功能的函数、我还替换了 UARTCharPut ()
    在"cabecera"和"convertir_Hexadeciment"函数中使用 UARTPrintf()的函数。
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void CONFIG_UART()
    {
    //ASIGNACIÓN DE PINES? RX y TX
    GPIOPinConfigure(GPIO_PA6_U2RX); //Configurar terminal de RX UART2
    GPIOPinConfigure(GPIO_PA7_U2TX); //Configurar terminal de TX UART2
    GPIOPinConfigure(GPIO_PB0_U1RX); //Configurar terminal de RX UART1
    GPIOPinConfigure(GPIO_PB1_U1TX); //Configurar terminal de TX UART1
    GPIOPinConfigure(GPIO_PA0_U0RX); //Configurar terminal de RX UART0
    GPIOPinConfigure(GPIO_PA1_U0TX); //Configurar terminal de TX UART0
    //configuración de dirección del puerto UART, reloj del modulo, baudrate, tamaño de bit y bit de paridad
    UARTConfigSetExpClk(UART2_BASE,g_ui32SysClock,9600,(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE)); //configuración de dirección del puerto UART1
    UARTConfigSetExpClk(UART1_BASE,g_ui32SysClock,9600,(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE)); //configuración de dirección del puerto UART1
    UARTConfigSetExpClk(UART0_BASE,g_ui32SysClock,9600,(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE)); //configuración de dirección del puerto UART0
    IntEnable(INT_UART2); //habilitación de interrupción por UART1
    UARTIntEnable(UART2_BASE,UART_INT_RX); //habilitar interrupción por recepción y transmision UART1
    IntEnable(INT_UART1); //habilitación de interrupción por UART1
    UARTIntEnable(UART1_BASE,UART_INT_RX); //habilitar interrupción por recepción y transmision UART1
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    Mayra、您好!

    好的、这就是我希望在 UARTprintf 调用时看到的结果。 遗憾的是、您的设置方式与以前的设置方式没有什么不同。 如果通过 UART 发送某些字符、打印字符将提示终端中断显示。

    为了演示这一点、我用"data"填充了一个50字节的缓冲区、该缓冲区从0x00开始、到0x49结束。

    然后、我以两种方式输出该缓冲器。 第一个是使用%c 发送字符:

    Fullscreen
    1
    2
    3
    4
    for(ui32LoopCount=0; ui32LoopCount<50; ui32LoopCount++)
    {
    UARTprintf("[ 0x%c ]", ui32DataBuffer[ui32LoopCount]);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    数据的输出结果如下:

    [ 0x ][ 0x[01]][ 0x[02]][ 0x[03]][ 0x[04]][ 0x[05]][ 0x[06]][ 0x[07]][ 0x[08]][ 0x ][ 0x
    ][ 0x[0B]][ 0x[0C]][ 0x
    ][ 0x[0E]][ 0x[0F]][ 0x[10]][ 0x[11]][ 0x[12]][ 0x[13]][ 0x[14]][ 0x[15]][ 0x[16]][ 0x[17]][0x[18]][0x119]][0x1A]][0x1A]][0x1Q][0x1C][0x1]][0x1C][0x1]][0x1]][0x1C][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x1]][0x][0x ][ 0x"][ 0x#][ 0x$][ 0x%][ 0x&][ 0x'][ 0x (][ 0x)][ 0x*][ 0x+][ 0x、][ 0x-][ 0x。 ][ 0x/][ 0x0 ][ 0x1 ]

    您可以看到两条断裂的线、它不会显示在 E2E 上、但那里也有一个从制表符中明显可见的空间(我之前指出、我以为空间是0x20、但我错了、它是0x09、而是制表符执行此操作)。

    然后、我执行相同的操作、但输出十进制值-即原始数据值。

    Fullscreen
    1
    2
    3
    4
    for(ui32LoopCount=0; ui32LoopCount<50; ui32LoopCount++)
    {
    UARTprintf("[ 0x%d ]", ui32DataBuffer[ui32LoopCount]);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    数据的结果输出现在为:

    [ 0x0 ][ 0x1][ 0x2][ 0x3][ 0x4][ 0x5][ 0x6][ 0x7][ 0x8][ 0x9][ 0x10][ 0x11][ 0x12][ 0x13][ 0x14][ 0x15][ 0x16][ 0x18][ 0x19][ 0x21][ 0x21][ 0x21][ 0x21][ 0x21][ 0x23][ 0x21][ 0x21][ 0x21][ 0x21][ 0x21] ][ 0x25 ][ 0x26 ][ 0x27 ][ 0x28 ][ 0x29 ][ 0x30 ][ 0x31 ][ 0x32 ][ 0x33 ][ 0x34 ][ 0x35 ][ 0x36 ][ 0x37 ][ 0x38 ][ 0x39 ][ 0x40 ][ 0x41 ][ 0x42 ][ 0x43 ][ 0x44 ][ 0x47 ][ 0x46 ][ 0x48 ][ 0x46 ][ 0x48 ] ]

    因此、您必须为 UARTprintf 使用正确的输出格式、以避免出现换行符等

    以下是两个输出后的 Termite:

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好!
    
    感谢您的建议、我尝试更改 UARTprintf 函数的格式代码、 
    它会发送完整的字符串。 抱歉、如果没有太多问题、您能告诉我为什么它被称为"原始数据"吗?
    此致、

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

    您好、Mayra、

    当然。  原始数据通常指未处理/分析的任何数据。 由于您提到过您正在读取热敏电阻、这意味着您尝试获取温度数据-但您显示的输出都是十六进制字符、问题似乎存在(现在已确认为) 源自非典型 ASCII 数字/字母的输出字符。 因此、在我看来 、数据似乎尚未经过处理、无法将传感器读数转换为"35摄氏度"等实际温度。 这方面我可能会错、但这正是我所期望的。

    此致、

    Ralph Jacobi