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.

[参考译文] RM42L432:带 sci 的十进制打印

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/575772/rm42l432-decimal-print-with-sci

器件型号:RM42L432

大家好、

我正在做一个简单的解决方案。 在这里、我想进行 PWM 更改计时周期、并在终端中打印当前计时周期。 我的代码基于 hetPwm 和 adcDisplay 示例。 代码工作正常、但我希望将 dutyCicle 值打印为十进制。  

以下是我的代码:

/*包含文件*/

#include "sys_common.h"

/*用户代码开始(1)*/
#include "het.h"


#define TIZE1 8
uint8 text1[TIZE1]={'r'、'n'、't'、'1't、


't'0'、't'0'、't'2'、't't's'、't'0'、't'ze2'、't't's's'e2'、't's's's'、't't's's'e2'、't's's's's'、'e2'、't's's's's's's's's's's's'、'e2'、'e'、's's's's's's's's's'e'、'e'、'e'、's's's's'e'、'e'、's's's's'e'、
's





void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度);

void sciDisplayData (scibase_t * sci、uint8 *文本、uint32长度);

void wait (uint32时间);

//*用户代码结束*

////**@fn void main (void)
*@brief Application main 函数
*@注意默认情况下,此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
//

//*用户代码开始(2)*/
uint32时间;
uint32 dutyCle;
float64 period_us;
uint32值;

//用户代码结束*/

int main (void)
{
//*用户代码开始(3)*/
sciInit();
sciDisplayText (scilinREG、&text1[0]、tisdutye0




= Zetus);sciIneiinteiC1000 = Zeth;
时间= 1000.0;

setPwm (dutyCleum、period_us);

while (1)
{
sciDisplayText (scilinREG、&text2[0]、TIZE2);

dutyCley=0;
值= dutyCicle;

while (dutyCley<=100)
{
sciDisplayText (scilinREG、&text3[0]、TsIZE3);
sciDisplayData (scilinREG、(uint8*)&value、4);
值= dutyCley;

setPwm (dutyCley, period_us);
//__delay_cycles (50000000);
dutyCley+=5;

wait (0xFFFFFF);
}
pwmStop (hetRAM1、pwm0);
sciDisplayText (scilinREG、&text4[0]、TMSIZE4);
Wait (0xFFFFFFF);
}

//*用户代码结束*



/*用户代码开始(4)*/
void setPwm (uint32 dutyCicle、float64 period_us)
{
hetInit ();

hetGNSIUs *、void setPwm 信号


周期= dutymr.pwt;duty 信号周期

= rmwmwmrh;pwmwmrandit 信号= durt;pwmwmwmwmwmwmrands = durt 信号周期
pwmSetDuty (hetRAM1、pwm0、pwmSignal.dDuty);
pwmStart (hetRAM1、pwm0);
}

void DisplayText (scii_t








* sci、uint8 *文本、uint32长度){while (length-)(scilini-);}void DisplayText (sci_t * sci+* 8 *、uint8 *、uint32 length);}uinte+= 0xuinte+、uint8 * wi+、uinte+ 1、uinte+ 1、uinte+= 0xinte+ 1、uinteUSt 2、uinte+ 1、uinte+ 1、uinte+ 1、uintex 2、uinte+ 1、uint




#if (__little_endian__==1)||(__little_ENDIAN__==1)
text = text +(length -1);
#endif

while (length---)
{
#if (__little_endian__==1)||(__little_ENDIAN_= 0x1+;


txt=



~ 0xtf0 =
~ 1+;text= 0t1+= t1+(txt+)*t1+= 0xt1+(txt1);ttxt+= t1+= t0t1+= t1+(txt1)


if (txt<=0x9)
{
txt +=0x30;
}
否则 if (txt > 0x9 && txt < 0xF)
{
txt +=0x37;
}
否则
{
txt = 0x30;
}

if (txt1 <= 0x9)
{
txt1 +=0x30;
}
否则((txt1 > 0x9)&&(txt1 <= 0x30





);}txt1 = 0x31;}= 0x31


while ((scilinREG->FLR & 0x4)== 4);//等待直至繁忙*/
sciSendByte (scilinREG、txt1);//发送文本
*/ while (scilinREG->FLR & 0x4)=4);//
等待直至繁忙*/ sciINTByte (scilinREG->Fr & 0x4);//*



等待时间};while

(uidt.32)*等待时间(uidt.out)

我的教师建议它可以是终端配置。 但我尝试了三种不同的终端软件、没有成功。

欢迎提出任何建议。

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

    您能否发布输出的快照并描述您希望在输出上看到的内容? 您是否能够看到 ASCII 字符串输出、而这只是在尝试显示十进制输出时出现的问题? 还是所有输出都损坏了? 对问题症状的一些详细说明可能有助于解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck。

    这是我的输出。

    是的、将这些十六进制(恰好在'loop.Duty_cley'之后)作为十进制0、5、10、15、.. 100、0、5、10、... 100、0、5、.
    我的问题是如何组织或编辑函数 sciDisplayData 以获得十进制输出。 我不确定问题是否在函数中。

    如有必要、我可以随附一个包含文件的 zip 文件。

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

    这是我的输出的正确屏幕截图。 很抱歉、另一个中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为何不尝试 www.cplusplus.com/.../ 创建格式化字符串、然后将创建的字符串发送到 sciDisplayText 函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Anthony

    感谢您的建议。 这似乎是有效的,但不是我希望的。 sprintf 函数打印在控制台上、sciDisplayData 打印在终端上、请查看下面的屏幕截图。 为什么会发生这种情况、有何不同?

    代码的修改部分  

    while (dutyCley<=100)
    {
    //sciDisplayText (scilinREG、&text3[0]、TMSIZE3);
    //DisplaysciData (scilinREG、(uint8*)&value、4);
    
    value = sprintf (buffer、"loop.dit_cicle \t %d"、dutyCicle);
    
    setPwm (dutyCleum、period_us);
    //_delay_cycles (50000000);
    dutyCle+=5;
    
    printf (buffer、 值);
    
    
    Wait (0xFFFFFFF);
    } 


    我想介绍一下这个解决方案、但我之前没有应用它、因为我想了解正在发生的情况、并想使用 sci lib。  I'v 的目的是在该函数中实现传感器读数、并将 PWM dutyCicle 的百分比与从传感器读取的值进行比较。

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

    在发送到发送数据例程之前、您需要将变量"value"转换为 BCD。 发送数据例程设置为发送十六进制值。

    将十六进制值转换为最多3位 BCD 值的一些简单代码为:

    uint8 val; //要转换
    uint16 bcdval 的值;//转换后的值
    uint8 d0、d1、d2;//用于写入0 ~ 255
    
    d2 = val / 100;
    val = 100 * d2;
    d1 = val / 10;
    d0 = val % 10;
    
    bcdval = d2 << 8 + d1 << 4 + d0; 

    这将处理高达999的值。  如果您需要更多数字、则需要添加一个分步以除以1000。

    另请注意、发送例程仅适用于2个字符(即00至99) 因此、需要对其进行修改以处理需要传递到其中的较大16位值、或者需要对打印值进行分区、以便您单独将2个8位 BCD 值传递到其中。

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

    Chuck、我花了一些时间尝试您的代码、但我不确定它是否正常工作、或者我是否了解转换应该在哪里。
    我调整了您显示的代码以仅转换2个字符、因为仅显示3个字符的零。 看看 I'v 从输出中得到的结果。




    这种与以下代码相关的调整:

    while (1)
    {
    sciDisplayText (scilinREG、&text2[0]、TMSIZE2);
    
    dutyCley=0;
    value = dutyCley;
    
    while (dutyCley<=100)
    {
    sciDisplayText (scilinREG、&text3[0]、TMSIZE3);
    value = bcdConvert (dutyCleyCleyCleyCley<=100);
    sciDisplayData (scilinREG、(uint8*)&value、4);
    
    setPwm (dutyCicle、period_us);
    //_ delay_cycles (5000000);
    dutyCicle+=5;
    
    Wait (0xFFFFFFF);
    }
    pwmStop (hetRAM1、pwm0);
    sciDisplayText (scilinREG、&text4[0]、TMSIZE4);
    Wait (0xFFFFFF);
    }
    
    
    uint32 bcdConvert (uint32值)
    {
    uint16 d0、d1、d2、d3;
    uint32 bcdValue;uint32 bcdc
    
    //D3 =值/1000;
    //value -= D3*1000;
    //D2 =值/100;
    //value -= D2*100;
    D1 =值/10;
    d0 =值%10;
    bcdValue = d1 << 4+d0;
    
    返回 bcdValue;
    } 

    之后、我注意到我将向发送例程发送十进制数。 我认为十六进制转换器到 bcd 无法这样工作、对吧? 我不应该向例程发送十六进制并在 de sciSendByte 之前转换该 valoue?

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

    向 sciSendByte 发送真十六进制值时的问题是、将该位转换为十进制数时、该位值可以是0到255之间的任意值。 因此、要发送该数据、您必须将其分解为三个字节的传输。 '2'5'5'。 除非接收端的器件能够理解发送的十六进制值、否则 sciSendByte 例程永远不会接收任何非字符串的输入。

    因此、该过程应该是:
    1) 范围检查您的值以确保其不会超过 SW 功能的流速(可处理多少位)
    2) 将值转换为 BCD (让我们将其称为 BCD_Value)
    3) 将 BCD_Value 中的最高有效位转换为 ASCII
    4) 发送 ASCII 字节
    5) 将 BCD_value 中的下一个数字转换为 ASCII
    6) 转到4并重复重置所有数字均已发送。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    卡盘、我明白了。 我发现了一个有效操作错误。 在回顾时、我看到了在发送到发送例程之前将数据转换为 BCD 时的屏幕截图、并注意到输出是半正确的(输出是在正确值和错误值上交替显示的)。 我只需括号、一切看起来都很正常。

    uint32 bcdConvert (uint32 value)
    {
    uint8 d0、D1、D2、D3;
    uint32 bcdValue;
    
    //D3 = Value/1000;
    //value -= D3*1000;
    D2 = Value/0x64;
    Value -= D2*100;
    D1 = Value/0x0A;
    D0 =值%0x0A;
    bcdValue =(D2 << 8)+(D1 << 4)+ d0;
    
    返回 bcdValue;
    } 

    感谢大家的支持和解释。


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

    很高兴听到!!

    很高兴您能够解决此问题、感谢您使用 Hercules E2E!