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/MSP430FR5969:如何针对 UART 将 uint64_t 转换为 uint8_t?

Guru**** 2537650 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/722205/ccs-msp430fr5969-how-to-convert-a-uint64_t-to-uint8_t-for-uart

器件型号:MSP430FR5969

工具/软件:Code Composer Studio

您好!  

我有一个 uint64_t (64位)数字、我需要通过8位 UART 发送、我该怎么做?

例如:

uint64_t x = 4626624930238680606;

我有一个代码(如下所示)在通过 UART 发送到 Raspberry Pi 之前存储用户输入、但我不想存储用户输入、而是希望发送"x"。

uint8_t 消息[]={'h'、'e'、'l'、'l'、'o'、 'W'、'o'、'r'、'l'、'd'、 "1"、"2"、"3"、"4"、"5"、"5"、 '6'};
uint8_t 数据[16];

//将一行文本写入终端
//myUart_writeBuf (channel_1、(unsigned char *) val、NULL、0);
_DELAY_CYCLES (10000000);
_enable_interrupt ();

unsigned int size = sizeof (Message);
unsigned int sizeMod16 = siz%16;
if (sizeMod16!=0)

  对于(i=0 <sizeMod16;i++)
  {
    data[i]=消息[i];
  }
  对于(i=0;i<16-sizeMod16;i++)
  {
    DATA[sizeMod16+I]=0x00;
  }

否则、如果(size = 16){
  对于(i=0;i<16;i++)
  {
    data[i]=消息[i];
  }

我该怎么做?

-Shawn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    拼写错误:
    "...但我不想存储用户输入、而是想存储"x"。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我已将此主题移至编译器论坛、编译器专家可在其中为您提供最佳指导。

    谢谢
    Ki
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道编译器专家、这是一个 C 语言问题。

    使用 UNION (这不是严格合法的 C、但适用于大多数编译器):

    UNION x{
    uint64_t big;
    uint8_t[8]块;
    } pick_a_part;

    (笑声)

    pick_a_part.big = data_TO_BE_SPLIT;

    UART_SEND (pick_a_part.chunks[0]);等等。

    我不确定此语法是否完全正确。 我不确定 TID区块[0]是 MSB 还是 LSB。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Keith Barkley"]我不确定区块[0]是 MSB 还是 LSB。

    LSB。   

    我同意这是一个合理的解决方案。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尽管这不是严格可移植的(Harbison 和 Steele 说您只能在分配类型后才能访问该类型)、但是否有任何编译器不允许进行类型冲压?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Keith Barkley">尽管这不是严格可移植的(Harbison 和 Steele 说您只能在分配类型后才能访问该类型)、但是否有任何编译器不允许进行类型冲压?

    [/报价]

    是否可移植是可争议的。 但是,在这种情况下,我们可以避免进行整个讨论。 它的定义非常明确、可以通过任何字符类型访问任何对象的字节。 假设是一个8位字符、您可以这么做

    size_t i;
    uint64_t x = 4626624930238680606;
    unsigned char *字节=(unsigned char*)&value;
    for (i=0;i <sizeof(x); ++i) uart_write(bytes[i]); )
    

    Markus

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

    我将添加一个详细信息。  Keith Barkley 在上一个员额中所述的联合打孔方法是根据 C99 C 标准具体核准的。 在第6.5节第7段中,它说...

    对象的存储值只能由具有以下类型之一的 lvalue 表达式访问:. 一种聚合或联合体类型,其中包括其成员中的上述类型之一。

    谢谢、此致、

    乔治

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