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.

[参考译文] 编译器/MSP430G2553:将十进制数转换为十六进制数,并使用十六进制数设置输出引脚

Guru**** 2538955 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/571804/compiler-msp430g2553-convert-a-decimal-to-hex-number-and-use-the-hex-number-to-set-output-pins

部件号:MSP430G2553

工具/软件:TI C/C++编译器

我要取一个像32这样的整数,将它转换为十六进制数,然后将它与0x连接起来,以生成一个字符X= 0x1f。 然后使用X设置P1OUT上的输出引脚。  
下面的代码执行我刚才解释的操作。 运行此程序时,我收到以下错误:类型为"char *"的值不能指派给类型为"unsigned char "的实体。  

有没有更好的方法将0x与十六进制数连接起来以设置WFP 1.0 ?

CHAR H[17]="0123456789ABCDEF";
static uint8_t num =32;//要转换为十六进制的十进制数
CHAR HEX [32];
静态uint8_t quo;//颈动脉
静态uint8_t长度;//余数
char *string ="0x";
字符*X;
十六进制[0]='\0';
while (num !=0)
{
Quo = num/16;
REM =数字% 16;
memmove (&hex[1],hex,strlen (hex)+1);
十六进制[0]= h[Rem];
num =现状;
//凹法
output= malloc(strlen(string)+strlen(hex)+1);
strcpy(X, string );
strcat (X,hex);
P1OUT =输出;
} 

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

    变量输出未声明。  所以我添加了一个声明"char *output;"。

    将--verbose_diagnostics添加到编译器生成选项,您会看到类似于...的内容。

    "file.c",第29行:警告:无法将"char *"类型的值分配给
    类型为“unsigned char”的实体
    P1OUT =输出;
    ^ 

    使用选项--gen_acd_raw构建。  这将创建一个编译器列表文件。  它位于与源文件同名的文件中,扩展名更改为.RL。  检查该文件并搜索P1OUT。  您将发现P1OUT的类型是...

    extern volatile unsigned char P1OUT; 

    因此,您不能将整个字符串写入P1OUT,只能写入一个字符。  这就是您收到错误消息的原因。

    我不知道硬件底层P1OUT的详细信息。  

    正在更改主题... 通常通过调用标准RTS函数snprintf来创建整数值的字符串表示。  这个功能有点大。  在您的情况下,您可以使用生成选项--printf_support=minimal大量减少该代码大小。

    MSP430编译器手册中介绍了本文中提到的所有编译器选项

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉,这是我的错误。 我想键入P1OUT = X,其中X现在定义为一个字符。

    谢谢! 我知道问题出在哪里。 我知道P1OUT必须写入一个volatile unsigned char类型。 我不明白如何将0x与char hex [4]=1F连接以获得volatile unsigned char =0x1f。 请你能帮我解决这个问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sahar Elyahoodayan 说:
    我不明白如何将0x与char hex [4]= 1F连接以获得volatile unsigned char = 0x1f。[/QUOT]

    类似这样的东西会起作用...

    #include <stdio.h>...
    
    #define BUFLEN 10
    CHAR BUFFER[BUFLEN];
    snprintf (BUFFER,BUFLEN,"0x%x",num); 

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么要尝试将整数转换为十六进制格式? 为什么不能只指定P1OUT = num?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你,George。 非常乐于助人!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    考古学家,我正在生成一个5位的随机数,然后将它转换成十六进制格式,以随机方式打开WFP 1.0 -WFP 1.4。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下两种陈述的行为没有区别:

    P1OUT = 32;
    P1OUT = 0x20;
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    太好了,我不知道。 谢谢! 所以我可以用5位随机数将它转换为十进制数并使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还有一个问题:如果我要将P1OUT设置为随机十进制数(随机),并且每个时钟都会发生变化,那么随机应具有什么格式? 我尝试过

    volatile uint8_t random;
    P1OUT = random; 

     但是P1OUT的价值并不是在每个时钟都更新,而是在1.0 高直流电压下保持。1.4

    谢谢!

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

    您需要生成一个随机数。  使用函数rand()并从循环内部调用它。